From d8d44a14c7c869a74efddac7a9eadee9139d4822 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 1 Dec 2022 19:40:52 -0500
Subject: [PATCH 001/196] ci: upgrade workflow actions version

---
 .github/scripts/files/examples.yml     | 13 +++++++++++--
 .github/workflows/branches.yml         |  2 +-
 .github/workflows/ci.yml               | 22 +++++++++++-----------
 .github/workflows/clean.yml            |  2 +-
 .github/workflows/examples.presets.yml |  4 ++--
 .github/workflows/examples.yml         |  4 ++--
 .github/workflows/label.yml            |  2 +-
 .github/workflows/stale.yml            |  2 +-
 .github/workflows/test.presets.yml     |  4 ++--
 .github/workflows/test.yml             |  8 ++++----
 source/plugins/core/README.md          | 12 ++++++------
 11 files changed, 42 insertions(+), 33 deletions(-)

diff --git a/.github/scripts/files/examples.yml b/.github/scripts/files/examples.yml
index a1bb7fb9496..1829a315493 100644
--- a/.github/scripts/files/examples.yml
+++ b/.github/scripts/files/examples.yml
@@ -41,7 +41,7 @@ jobs:
     if: "github.repository == 'lowlighter/metrics'"
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
       - name: Checkout examples
@@ -68,6 +68,15 @@ jobs:
           git commit -m "chore: update examples"
           git push --force
 
+          set +e
+          git config user.name github-actions[bot]
+          git config user.email 41898282+github-actions[bot]@users.noreply.github.com
+          git pull
+          sudo cp /metrics_renders/* ./
+          git add --all
+          git commit -m "chore: update examples"
+          git push --force
+
 # ======================================================================================
 # Special job used to render lowlighter/metrics repository assets
 # ======================================================================================
@@ -78,7 +87,7 @@ jobs:
     if: "github.repository == 'lowlighter/metrics'"
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
       - name: Checkout examples
diff --git a/.github/workflows/branches.yml b/.github/workflows/branches.yml
index bd0bf5f7a8d..5b3dede5ffb 100644
--- a/.github/workflows/branches.yml
+++ b/.github/workflows/branches.yml
@@ -13,7 +13,7 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Comment on pull request
-        uses: actions/github-script@v5
+        uses: actions/github-script@v6
         with:
           script: |
             const {issue:{number:issue_number}, repo:{owner, repo}} = context
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 66dec2e16cc..b0160e6495e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -20,7 +20,7 @@ jobs:
     if: always() && (needs.build-test-analyze.result == 'success' || needs.build-test-analyze.result == 'skipped')
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
       - name: Setup Dprint
@@ -50,11 +50,11 @@ jobs:
     needs: [ format ]
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
       - name: Setup NodeJS
-        uses: actions/setup-node@v2
+        uses: actions/setup-node@v3
         with:
           node-version: 17
       - name: Pull changes
@@ -73,11 +73,11 @@ jobs:
     needs: [ update-indexes ]
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
       - name: Setup NodeJS
-        uses: actions/setup-node@v2
+        uses: actions/setup-node@v3
         with:
           node-version: 17
       - name: Pull
@@ -96,7 +96,7 @@ jobs:
     needs: [ update-indexes ]
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Login to GitHub registry
         run: echo ${{ github.token }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
       - name: Build docker image
@@ -180,7 +180,7 @@ jobs:
     if: contains(github.event.head_commit.message, '[release]')
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Login to GitHub registry
         run: echo ${{ github.token }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin
       - name: Pull docker image (master)
@@ -201,11 +201,11 @@ jobs:
     needs: [ docker-release ]
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
       - name: Setup NodeJS
-        uses: actions/setup-node@v2
+        uses: actions/setup-node@v3
         with:
           node-version: 17
       - name: Setup metrics
@@ -254,9 +254,9 @@ jobs:
     needs: [ action-latest-test, deploy-latest ]
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Setup NodeJS
-        uses: actions/setup-node@v2
+        uses: actions/setup-node@v3
         with:
           node-version: 17
       - name: Setup metrics
diff --git a/.github/workflows/clean.yml b/.github/workflows/clean.yml
index 53bb3df9bda..c7bed12a577 100644
--- a/.github/workflows/clean.yml
+++ b/.github/workflows/clean.yml
@@ -13,7 +13,7 @@ jobs:
     continue-on-error: true
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Run script
         run: ./delete_ghcr_dangling_images.sh lowlighter metrics
         working-directory: .github/actions/ghcr-clean
diff --git a/.github/workflows/examples.presets.yml b/.github/workflows/examples.presets.yml
index 407ffb2b0fb..2e220d371cc 100644
--- a/.github/workflows/examples.presets.yml
+++ b/.github/workflows/examples.presets.yml
@@ -10,11 +10,11 @@ jobs:
     if: "github.repository == 'lowlighter/metrics'"
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
       - name: Setup NodeJS
-        uses: actions/setup-node@v2
+        uses: actions/setup-node@v3
         with:
           node-version: 17
       - name: Setup metrics
diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 414aa419372..c375d9efeca 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -41,7 +41,7 @@ jobs:
     if: "github.repository == 'lowlighter/metrics'"
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
       - name: Checkout examples
@@ -1347,7 +1347,7 @@ jobs:
     if: "github.repository == 'lowlighter/metrics'"
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
       - name: Checkout examples
diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml
index 3b5aadeec3d..80c8c77c882 100644
--- a/.github/workflows/label.yml
+++ b/.github/workflows/label.yml
@@ -7,7 +7,7 @@ jobs:
     name: Label issue and pull requests
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/labeler@v2
+      - uses: actions/labeler@v4
         with:
           repo-token: "${{ secrets.GITHUB_TOKEN }}"
           configuration-path: .github/config/label.yml
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 9e937f73301..69f76154563 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -40,7 +40,7 @@ jobs:
     continue-on-error: true
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Run script
         run: ./delete_workflows.sh lowlighter/metrics
         working-directory: .github/actions/ghcr-clean
diff --git a/.github/workflows/test.presets.yml b/.github/workflows/test.presets.yml
index 4053a8e15ad..38b992f12d5 100644
--- a/.github/workflows/test.presets.yml
+++ b/.github/workflows/test.presets.yml
@@ -16,12 +16,12 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
           ref: master
       - name: Setup NodeJS
-        uses: actions/setup-node@v2
+        uses: actions/setup-node@v3
         with:
           node-version: 17
       - name: Setup metrics
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 9cbc1d34f7b..f86a4938a00 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -13,11 +13,11 @@ jobs:
     runs-on: ubuntu-latest
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
         with:
           fetch-depth: 0
       - name: Setup NodeJS
-        uses: actions/setup-node@v2
+        uses: actions/setup-node@v3
         with:
           node-version: 17
       - name: Setup metrics
@@ -36,7 +36,7 @@ jobs:
     needs: [ lint ]
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Format code with dprint
         run: |
           curl -fsSL https://dprint.dev/install.sh | sh
@@ -55,7 +55,7 @@ jobs:
     needs: [ lint ]
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v2
+        uses: actions/checkout@v3
       - name: Setup CodeQL
         uses: github/codeql-action/init@v2
         with:
diff --git a/source/plugins/core/README.md b/source/plugins/core/README.md
index a44b3e2ec74..fb67beeaa03 100644
--- a/source/plugins/core/README.md
+++ b/source/plugins/core/README.md
@@ -68,7 +68,7 @@ These options support two different syntaxes:
 Skip repositories by:
 - using their full handle (e.g. `user/repo`)
 - using only their name (e.g. `repo`)
-  - *in this case, the owner may be implicitly set to current `user` option* 
+  - *in this case, the owner may be implicitly set to current `user` option*
 
 *Example: skipping repositories with basic pattern matching*
 ```yml
@@ -81,7 +81,7 @@ repositories_skipped: my-repo, user/my-repo
 
 To enable advanced pattern matching to skip repositories, include `@use.patterns` at the beginning of the option value.
 
-Skip repositories by writing file-glob patterns, with any of the supported operation: 
+Skip repositories by writing file-glob patterns, with any of the supported operation:
 - `#` to write comments
 - `-` to exclude repositories
   - *the `-` is implicit and may be omitted from excluding patterns*
@@ -93,15 +93,15 @@ Skip repositories by writing file-glob patterns, with any of the supported opera
 ```yml
 repositories_skipped: |
   @use.patterns
-  
+
   # Skip a specific repository (both patterns are equivalent)
-  user/repo 
+  user/repo
   -user/repo
 
   # Skip repositories matching a given pattern
   user/repo-*
   {user1, user2, user3}/*
-  
+
   # Include back a previously skipped repository
   org/repo
   +org/include-this-repo
@@ -368,7 +368,7 @@ metrics:
     contents: write
   steps:
     - name: Checkout repository
-      uses: actions/checkout@v2
+      uses: actions/checkout@v3
         with:
           fetch-depth: 0
 

From 0e431bb5941243e92bc3db09e585713190e93c51 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 7 Dec 2022 22:17:17 -0500
Subject: [PATCH 002/196] ci: upgrade workflow actions version

---
 .github/workflows/stale.yml | 14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 69f76154563..97ab2781074 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -10,30 +10,28 @@ jobs:
     name: Flag stale issues and pull requests
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/stale@v3
+      - uses: actions/stale@v6
         with:
-          repo-token: ${{ github.token }}
           stale-pr-message: This pull request seems to be inactive and will be automatically closed in a few days if it remains without any activity.
           days-before-pr-stale: 21
           days-before-pr-close: 3
           stale-pr-label: ⏹️ stale
           remove-stale-when-updated: yes
-          operations-per-run: 100
   lock:
     name: Lock inactive closed issues and pull requests
     needs:
       - stale
     runs-on: ubuntu-latest
     steps:
-      - uses: dessant/lock-threads@v2
+      - uses: dessant/lock-threads@v4
         with:
           github-token: ${{ github.token }}
-          issue-lock-inactive-days: 14
+          issue-inactive-days: 14
           issue-lock-reason: ""
-          issue-lock-labels: ☑️ archived
-          pr-lock-inactive-days: 14
+          add-issue-labels: ☑️ archived
+          pr-inactive-days: 14
           pr-lock-reason: ""
-          pr-lock-labels: ☑️ archived
+          add-pr-labels: ☑️ archived
   workflows:
     name: Remove expired workflow runs
     runs-on: ubuntu-latest

From 5e2ea64d8a10a770edaacd4da69e45ecfac7e41d Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 7 Dec 2022 22:18:46 -0500
Subject: [PATCH 003/196] feat(plugins/community/splatoon): upgrade s3si
 version

---
 .../plugins/community/splatoon/s3si/index.ts  | 196 ++++++++++++------
 1 file changed, 129 insertions(+), 67 deletions(-)

diff --git a/source/plugins/community/splatoon/s3si/index.ts b/source/plugins/community/splatoon/s3si/index.ts
index 6b3679ab337..7cb9f94b025 100644
--- a/source/plugins/community/splatoon/s3si/index.ts
+++ b/source/plugins/community/splatoon/s3si/index.ts
@@ -1,7 +1,6 @@
 // deno-fmt-ignore-file
 // deno-lint-ignore-file
 // This code was bundled using `deno bundle` and it's not recommended to edit it manually
-// https://raw.githubusercontent.com/spacemeowx2/s3si.ts/main/s3si.ts
 
 class APIError extends Error {
     response;
@@ -13,9 +12,9 @@ class APIError extends Error {
     }
 }
 const AGENT_NAME = "s3si.ts";
-const S3SI_VERSION = "0.1.36";
-const NSOAPP_VERSION = "2.3.1";
-const WEB_VIEW_VERSION = "2.0.0-8a061f6c";
+const S3SI_VERSION = "0.2.1";
+const NSOAPP_VERSION = "2.4.0";
+const WEB_VIEW_VERSION = "2.0.0-18810d39";
 const S3SI_LINK = "https://github.com/spacemeowx2/s3si.ts";
 const USERAGENT = `${AGENT_NAME}/${S3SI_VERSION} (${S3SI_LINK})`;
 const DEFAULT_APP_USER_AGENT = "Mozilla/5.0 (Linux; Android 11; Pixel 5) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/94.0.4606.61 Mobile Safari/537.36";
@@ -5033,6 +5032,11 @@ function s3siGameId(id) {
     const tsUuid = fullId.slice(fullId.length - 52, fullId.length);
     return mod6.v5.generate(S3SI_NAMESPACE, tsUuid);
 }
+function s3sCoopGameId(id) {
+    const fullId = mod.decode(id);
+    const tsUuid = fullId.slice(fullId.length - 52, fullId.length);
+    return mod6.v5.generate(COOP_NAMESPACE, tsUuid);
+}
 function parseHistoryDetailId(id) {
     const plainText = new TextDecoder().decode(mod.decode(id));
     const vsRE = /VsHistoryDetail-([a-z0-9-]+):(\w+):(\d{8}T\d{6})_([0-9a-f-]{36})/;
@@ -5460,6 +5464,7 @@ var Queries;
     Queries["LatestBattleHistoriesQuery"] = "4f5f26e64bca394b45345a65a2f383bd";
     Queries["RegularBattleHistoriesQuery"] = "d5b795d09e67ce153e622a184b7e7dfa";
     Queries["BankaraBattleHistoriesQuery"] = "de4754588109b77dbcb90fbe44b612ee";
+    Queries["XBattleHistoriesQuery"] = "45c74fefb45a49073207229ca65f0a62";
     Queries["PrivateBattleHistoriesQuery"] = "1d6ed57dc8b801863126ad4f351dfb9a";
     Queries["VsHistoryDetailQuery"] = "291295ad311b99a6288fc95a5c4cb2d2";
     Queries["CoopHistoryQuery"] = "6ed02537e4a65bbb5e7f4f23092f6154";
@@ -5612,6 +5617,9 @@ class Splatnet3 {
         const resp = await this.request(Queries.BankaraBattleHistoriesQuery);
         return resp;
     }
+    async getXBattleHistories() {
+        return await this.request(Queries.XBattleHistoriesQuery);
+    }
     async getCoopHistories() {
         const resp = await this.request(Queries.CoopHistoryQuery);
         return resp;
@@ -5709,6 +5717,16 @@ const COOP_POINT_MAP = {
     2: 0,
     3: 20
 };
+async function checkResponse(resp) {
+    if (Math.floor(resp.status / 100) !== 2) {
+        const json = await resp.json().catch(()=>undefined);
+        throw new APIError({
+            response: resp,
+            json,
+            message: "Failed to fetch data from stat.ink"
+        });
+    }
+}
 class StatInkAPI {
     statInk;
     FETCH_LOCK;
@@ -5719,11 +5737,7 @@ class StatInkAPI {
         this.statInk = "https://stat.ink";
         this.FETCH_LOCK = new Mutex();
         this.cache = {};
-        this._specialMap = new Map();
         this._salmonWeaponMap = new Map();
-        this.getSpecial = ()=>{
-            throw new Error("Not implemented");
-        };
         this.getSalmonWeapon = ()=>this._getCached(`${this.statInk}/api/v3/salmon/weapon?full=1`);
         this.getWeapon = ()=>this._getCached(`${this.statInk}/api/v3/weapon?full=1`);
         this.getAbility = ()=>this._getCached(`${this.statInk}/api/v3/ability?full=1`);
@@ -5744,6 +5758,7 @@ class StatInkAPI {
             url: type === "VsInfo" ? `${this.statInk}/api/v3/s3s/uuid-list` : `${this.statInk}/api/v3/salmon/uuid-list`,
             headers: this.requestHeaders()
         });
+        await checkResponse(response);
         const uuidResult = await response.json();
         if (!Array.isArray(uuidResult)) {
             throw new APIError({
@@ -5819,6 +5834,7 @@ class StatInkAPI {
                 url,
                 headers: this.requestHeaders()
             });
+            await checkResponse(resp);
             const json = await resp.json();
             this.cache[url] = json;
             return json;
@@ -5840,25 +5856,6 @@ class StatInkAPI {
             ];
         }
     }
-    _specialMap;
-    async getSpecialMap() {
-        if (this._specialMap.size === 0) {
-            const specials = await this.getSpecial();
-            for (const special of specials){
-                for (const name of Object.values(special.name).flatMap((n)=>this._getAliasName(n))){
-                    const prevKey = this._specialMap.get(name);
-                    if (prevKey !== undefined && prevKey !== special.key) {
-                        console.warn(`Duplicate weapon name: ${name}`);
-                    }
-                    this._specialMap.set(name, special.key);
-                }
-            }
-            if (this._specialMap.size === 0) {
-                throw new Error("Failed to get salmon weapon map");
-            }
-        }
-        return this._specialMap;
-    }
     _salmonWeaponMap;
     async getSalmonWeaponMap() {
         if (this._salmonWeaponMap.size === 0) {
@@ -5878,7 +5875,6 @@ class StatInkAPI {
         }
         return this._salmonWeaponMap;
     }
-    getSpecial;
     getSalmonWeapon;
     getWeapon;
     getAbility;
@@ -5926,7 +5922,8 @@ class StatInkExporter {
         for (const id of list){
             const s3sId = await gameId(id);
             const s3siId = await s3siGameId(id);
-            if (!uuid.includes(s3sId) && !uuid.includes(s3siId)) {
+            const s3sCoopId = await s3sCoopGameId(id);
+            if (!uuid.includes(s3sId) && !uuid.includes(s3siId) && !uuid.includes(s3sCoopId)) {
                 out.push(id);
             }
         }
@@ -5960,6 +5957,8 @@ class StatInkExporter {
             } else if (modeId === 8) {
                 throw new Error("Tri-color battle is not supported");
             }
+        } else if (vsMode === "X_MATCH") {
+            return "xmatch";
         }
         throw new TypeError(`Unknown vsMode ${vsMode}`);
     }
@@ -6021,7 +6020,7 @@ class StatInkExporter {
         }
         return result;
     };
-    async mapBattle({ challengeProgress , bankaraMatchChallenge , listNode , detail: vsDetail , rankBeforeState , rankState  }) {
+    async mapBattle({ groupInfo , challengeProgress , bankaraMatchChallenge , listNode , detail: vsDetail , rankBeforeState , rankState  }) {
         const { knockout , vsRule: { rule  } , myTeam , otherTeams , bankaraMatch , festMatch , playedTime  } = vsDetail;
         const self = vsDetail.myTeam.players.find((i)=>i.isMyself);
         if (!self) {
@@ -6073,7 +6072,7 @@ class StatInkExporter {
         result.our_team_count = myTeam?.result?.score ?? undefined;
         result.their_team_count = otherTeams?.[0]?.result?.score ?? undefined;
         result.rank_exp_change = bankaraMatch?.earnedUdemaePoint ?? undefined;
-        if (listNode) {
+        if (listNode?.udemae) {
             [result.rank_before, result.rank_before_s_plus] = parseUdemae(listNode.udemae);
         }
         if (bankaraMatchChallenge && challengeProgress) {
@@ -6085,9 +6084,17 @@ class StatInkExporter {
                 result.rank_after = result.rank_before;
                 result.rank_after_s_plus = result.rank_before_s_plus;
             }
+        }
+        if (challengeProgress) {
             result.challenge_win = challengeProgress.winCount;
             result.challenge_lose = challengeProgress.loseCount;
         }
+        if (vsDetail.xMatch) {
+            result.x_power_before = result.x_power_after = vsDetail.xMatch.lastXPower;
+            if (groupInfo?.xMatchMeasurement && groupInfo?.xMatchMeasurement.state === "COMPLETED" && challengeProgress?.index === 0) {
+                result.x_power_after = groupInfo.xMatchMeasurement.xPowerAfter;
+            }
+        }
         if (rankBeforeState && rankState) {
             result.rank_before_exp = rankBeforeState.rankPoint;
             result.rank_after_exp = rankState.rankPoint;
@@ -6103,22 +6110,22 @@ class StatInkExporter {
         }
         return result;
     }
-    isRandomWeapon(image) {
-        const RANDOM_WEAPON_FILENAME = "473fffb2442075078d8bb7125744905abdeae651b6a5b7453ae295582e45f7d1";
+    isRandom(image) {
+        const RANDOM_FILENAME = "473fffb2442075078d8bb7125744905abdeae651b6a5b7453ae295582e45f7d1";
         const url = image?.url;
         if (typeof url === "string") {
-            return url.includes(RANDOM_WEAPON_FILENAME);
+            return url.includes(RANDOM_FILENAME);
         } else if (url === undefined || url === null) {
             return false;
         } else {
-            return url.pathname.includes(RANDOM_WEAPON_FILENAME);
+            return url.pathname.includes(RANDOM_FILENAME);
         }
     }
     async mapCoopWeapon({ name , image  }) {
         const weaponMap = await this.api.getSalmonWeaponMap();
         const weapon = weaponMap.get(name);
         if (!weapon) {
-            if (this.isRandomWeapon(image)) {
+            if (this.isRandom(image)) {
                 return null;
             }
             throw new Error(`Weapon not found: ${name}`);
@@ -6131,13 +6138,23 @@ class StatInkExporter {
         const hash = /\/(\w+)_0\.\w+/.exec(imageName)?.[1] ?? "";
         const special = SPLATNET3_STATINK_MAP.COOP_SPECIAL_MAP[hash];
         if (!special) {
+            if (this.isRandom(image)) {
+                return Promise.resolve(undefined);
+            }
             throw new Error(`Special not found: ${name} (${imageName})`);
         }
         return Promise.resolve(special);
     }
-    async mapCoopPlayer({ player , weapons , specialWeapon , defeatEnemyCount , deliverCount , goldenAssistCount , goldenDeliverCount , rescueCount , rescuedCount  }) {
+    async mapCoopPlayer(isMyself, { player , weapons , specialWeapon , defeatEnemyCount , deliverCount , goldenAssistCount , goldenDeliverCount , rescueCount , rescuedCount  }) {
+        const disconnected = [
+            goldenDeliverCount,
+            deliverCount,
+            rescueCount,
+            rescuedCount,
+            defeatEnemyCount
+        ].every((v)=>v === 0) || !specialWeapon;
         return {
-            me: player.isMyself ? "yes" : "no",
+            me: isMyself ? "yes" : "no",
             name: player.name,
             number: player.nameId,
             splashtag_title: player.byname,
@@ -6150,7 +6167,7 @@ class StatInkExporter {
             rescue: rescueCount,
             rescued: rescuedCount,
             defeat_boss: defeatEnemyCount,
-            disconnected: specialWeapon ? "no" : "yes"
+            disconnected: disconnected ? "yes" : "no"
         };
     }
     mapKing(id) {
@@ -6162,7 +6179,9 @@ class StatInkExporter {
     }
     async mapWave(wave) {
         const event = wave.eventWave ? SPLATNET3_STATINK_MAP.COOP_EVENT_MAP[b64Number(wave.eventWave.id)] : undefined;
-        const special_uses = (await Promise.all(wave.specialWeapons.map((w)=>this.mapSpecial(w)))).reduce((p, key)=>({
+        const special_uses = (await Promise.all(wave.specialWeapons.map((w)=>this.mapSpecial(w)))).flatMap((key)=>key ? [
+                key
+            ] : []).reduce((p, key)=>({
                 ...p,
                 [key]: (p[key] ?? 0) + 1
             }), {});
@@ -6199,12 +6218,16 @@ class StatInkExporter {
         let title_before = undefined;
         let title_exp_before = undefined;
         const expDiff = COOP_POINT_MAP[clear_waves];
-        if (nonNullable(title_exp_after) && nonNullable(expDiff)) {
+        if (nonNullable(title_after) && nonNullable(title_exp_after) && nonNullable(expDiff)) {
             if (title_exp_after === 40 && expDiff === 20) {} else if (title_exp_after === 40 && expDiff < 0 && title_after !== "8") {} else if (title_exp_after === 999 && expDiff !== 0) {
                 title_before = title_after;
             } else {
-                title_before = title_after;
-                title_exp_before = title_exp_after - expDiff;
+                if (title_exp_after - expDiff >= 0) {
+                    title_before = title_after;
+                    title_exp_before = title_exp_after - expDiff;
+                } else {
+                    title_before = (parseInt(title_after) - 1).toString();
+                }
             }
         }
         let fail_reason = null;
@@ -6240,8 +6263,8 @@ class StatInkExporter {
             job_bonus: detail.jobBonus,
             waves: await Promise.all(detail.waveResults.map((w)=>this.mapWave(w))),
             players: await Promise.all([
-                this.mapCoopPlayer(myResult),
-                ...memberResults.map((p)=>this.mapCoopPlayer(p))
+                this.mapCoopPlayer(true, myResult),
+                ...memberResults.map((p)=>this.mapCoopPlayer(false, p))
             ]),
             bosses,
             agent: AGENT_NAME,
@@ -6387,7 +6410,7 @@ const splusParams = ()=>{
                 300 + level * 350,
                 300 + (level + 1) * 350
             ],
-            charge: 160
+            charge: 180
         };
         if (level === 9) {
             item.promotion = true;
@@ -6400,7 +6423,7 @@ const splusParams = ()=>{
             0,
             9999
         ],
-        charge: 160
+        charge: 180
     });
     return out;
 };
@@ -6461,7 +6484,7 @@ const RANK_PARAMS = [
             200,
             500
         ],
-        charge: 100
+        charge: 110
     },
     {
         rank: "A",
@@ -6469,7 +6492,7 @@ const RANK_PARAMS = [
             500,
             800
         ],
-        charge: 110
+        charge: 120
     },
     {
         rank: "A+",
@@ -6477,7 +6500,7 @@ const RANK_PARAMS = [
             800,
             1100
         ],
-        charge: 120,
+        charge: 130,
         promotion: true
     },
     {
@@ -6486,14 +6509,14 @@ const RANK_PARAMS = [
             300,
             1000
         ],
-        charge: 150,
+        charge: 170,
         promotion: true
     },
     ...splusParams()
 ];
 function addRank(state, delta) {
     const { rank , rankPoint  } = state;
-    const { gameId , rankAfter , isPromotion , isRankUp , isChallengeFirst  } = delta;
+    const { gameId , timestamp , rankAfter , isPromotion , isRankUp , isChallengeFirst  } = delta;
     const rankIndex = RANK_PARAMS.findIndex((r)=>r.rank === rank);
     if (rankIndex === -1) {
         throw new Error(`Rank not found: ${rank}`);
@@ -6502,12 +6525,14 @@ function addRank(state, delta) {
     if (isChallengeFirst) {
         return {
             gameId,
+            timestamp,
             rank,
             rankPoint: rankPoint - rankParam.charge
         };
     }
     if (rankIndex === RANK_PARAMS.length - 1) {
         return {
+            timestamp,
             gameId,
             rank,
             rankPoint: Math.min(rankPoint + delta.rankPoint, rankParam.pointRange[1])
@@ -6517,12 +6542,14 @@ function addRank(state, delta) {
         const nextRankParam = RANK_PARAMS[rankIndex + 1];
         return {
             gameId,
+            timestamp,
             rank: nextRankParam.rank,
             rankPoint: nextRankParam.pointRange[0]
         };
     }
     return {
         gameId,
+        timestamp,
         rank: rankAfter ?? rank,
         rankPoint: rankPoint + delta.rankPoint
     };
@@ -6547,6 +6574,7 @@ function generateDeltaList(state, flatten) {
         let delta = {
             beforeGameId,
             gameId: i.gameId,
+            timestamp: Math.floor(i.time.getTime() / 1000),
             rankPoint: 0,
             isPromotion: false,
             isRankUp: false,
@@ -6582,12 +6610,16 @@ function generateDeltaList(state, flatten) {
 }
 function getRankState(i) {
     const rank = i.detail.udemae;
+    if (!rank) {
+        throw new Error("rank must be defined");
+    }
     const param = RANK_PARAMS.find((i)=>i.rank === rank);
     if (!param) {
         throw new Error(`Rank not found: ${rank}`);
     }
     return {
         gameId: i.gameId,
+        timestamp: Math.floor(i.time.getTime() / 1000),
         rank,
         rankPoint: -1
     };
@@ -6627,6 +6659,7 @@ class RankTracker {
     async updateState(history) {
         const flatten = await Promise.all(history.flatMap(({ historyDetails , bankaraMatchChallenge  })=>{
             return historyDetails.nodes.map((j, index)=>({
+                    id: j.id,
                     time: battleTime(j.id),
                     gameId: gameId(j.id),
                     bankaraMatchChallenge,
@@ -6683,6 +6716,8 @@ class GameFetcher {
     bankaraHistory;
     coopLock = new Mutex();
     coopHistory;
+    xMatchLock = new Mutex();
+    xMatchHistory;
     constructor({ cache =new MemoryCache() , splatnet , state  }){
         this._splatnet = splatnet;
         this.cache = cache;
@@ -6712,7 +6747,23 @@ class GameFetcher {
     getRankStateById(id) {
         return this.rankTracker.getRankStateById(id);
     }
+    getXMatchHistory() {
+        if (!this._splatnet) {
+            return [];
+        }
+        return this.xMatchLock.use(async ()=>{
+            if (this.xMatchHistory) {
+                return this.xMatchHistory;
+            }
+            const { xBattleHistories: { historyGroups  }  } = await this.splatnet.getXBattleHistories();
+            this.xMatchHistory = historyGroups.nodes;
+            return this.xMatchHistory;
+        });
+    }
     getBankaraHistory() {
+        if (!this._splatnet) {
+            return [];
+        }
         return this.bankaraLock.use(async ()=>{
             if (this.bankaraHistory) {
                 return this.bankaraHistory;
@@ -6723,6 +6774,9 @@ class GameFetcher {
         });
     }
     getCoopHistory() {
+        if (!this._splatnet) {
+            return [];
+        }
         return this.coopLock.use(async ()=>{
             if (this.coopHistory) {
                 return this.coopHistory;
@@ -6750,16 +6804,20 @@ class GameFetcher {
             groupInfo
         };
     }
-    async getBattleMetaById(id) {
+    async getBattleMetaById(id, vsMode) {
         const gid = await gameId(id);
-        const bankaraHistory = this._splatnet ? await this.getBankaraHistory() : [];
         const gameIdMap = new Map();
-        for (const i of bankaraHistory){
-            for (const j of i.historyDetails.nodes){
-                gameIdMap.set(j, await gameId(j.id));
+        let group = null;
+        let listNode = null;
+        if (vsMode === "BANKARA" || vsMode === "X_MATCH") {
+            const bankaraHistory = vsMode === "BANKARA" ? await this.getBankaraHistory() : await this.getXMatchHistory();
+            for (const i of bankaraHistory){
+                for (const j of i.historyDetails.nodes){
+                    gameIdMap.set(j, await gameId(j.id));
+                }
             }
+            group = bankaraHistory.find((i)=>i.historyDetails.nodes.some((i)=>gameIdMap.get(i) === gid)) ?? null;
         }
-        const group = bankaraHistory.find((i)=>i.historyDetails.nodes.some((i)=>gameIdMap.get(i) === gid));
         if (!group) {
             return {
                 type: "VsInfo",
@@ -6767,16 +6825,19 @@ class GameFetcher {
                 bankaraMatchChallenge: null,
                 listNode: null,
                 rankState: null,
-                rankBeforeState: null
+                rankBeforeState: null,
+                groupInfo: null
             };
         }
-        const { bankaraMatchChallenge  } = group;
-        const listNode = group.historyDetails.nodes.find((i)=>gameIdMap.get(i) === gid) ?? null;
-        const index = group.historyDetails.nodes.indexOf(listNode);
+        const { bankaraMatchChallenge , xMatchMeasurement  } = group;
+        const { historyDetails , ...groupInfo } = group;
+        listNode = historyDetails.nodes.find((i)=>gameIdMap.get(i) === gid) ?? null;
+        const index = historyDetails.nodes.indexOf(listNode);
         let challengeProgress = null;
-        if (bankaraMatchChallenge) {
-            const pastBattles = group.historyDetails.nodes.slice(0, index);
-            const { winCount , loseCount  } = bankaraMatchChallenge;
+        const challengeOrMeasurement = bankaraMatchChallenge || xMatchMeasurement;
+        if (challengeOrMeasurement) {
+            const pastBattles = historyDetails.nodes.slice(0, index);
+            const { winCount , loseCount  } = challengeOrMeasurement;
             challengeProgress = {
                 index,
                 winCount: winCount - pastBattles.filter((i)=>i.judgement == "WIN").length,
@@ -6793,7 +6854,8 @@ class GameFetcher {
             listNode,
             challengeProgress,
             rankState: after ?? null,
-            rankBeforeState: before ?? null
+            rankBeforeState: before ?? null,
+            groupInfo
         };
     }
     cacheDetail(id, getter) {
@@ -6820,7 +6882,7 @@ class GameFetcher {
     }
     async fetchBattle(id) {
         const detail = await this.cacheDetail(id, ()=>this.splatnet.getBattleDetail(id).then((r)=>r.vsHistoryDetail));
-        const metadata = await this.getBattleMetaById(id);
+        const metadata = await this.getBattleMetaById(id, detail.vsMode.mode);
         const game = {
             ...metadata,
             detail

From 124365491f580e8048c5e4a83e6d7f89099e7fb5 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 7 Dec 2022 22:19:11 -0500
Subject: [PATCH 004/196] chore(deps): bump decode-uri-component from 0.2.0 to
 0.2.2 (#1308) [skip ci]

---
 package-lock.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 05abf06d8ab..6eb950bf593 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4611,9 +4611,9 @@
       "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw=="
     },
     "node_modules/decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==",
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
       "optional": true,
       "engines": {
         "node": ">=0.10"
@@ -14136,9 +14136,9 @@
       "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw=="
     },
     "decode-uri-component": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
-      "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==",
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
       "optional": true
     },
     "decompress-response": {

From dec207ee811d76de1977c63e8b6dd157ecd42f06 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 7 Dec 2022 22:19:23 -0500
Subject: [PATCH 005/196] chore(deps): bump d3 from 7.6.1 to 7.7.0 (#1307)
 [skip ci]

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6eb950bf593..3e1469e3e0e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,7 +21,7 @@
         "clipboard": "^2.0.11",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
-        "d3": "^7.6.1",
+        "d3": "^7.7.0",
         "d3-node": "^3.0.0",
         "ejs": "^3.1.8",
         "emoji-name-map": "^1.2.9",
@@ -3599,9 +3599,9 @@
       "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
     },
     "node_modules/d3": {
-      "version": "7.6.1",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.6.1.tgz",
-      "integrity": "sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.7.0.tgz",
+      "integrity": "sha512-VEwHCMgMjD2WBsxeRGUE18RmzxT9Bn7ghDpzvTEvkLSBAKgTMydJjouZTjspgQfRHpPt/PB3EHWBa6SSyFQq4g==",
       "dependencies": {
         "d3-array": "3",
         "d3-axis": "3",
@@ -13326,9 +13326,9 @@
       "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
     },
     "d3": {
-      "version": "7.6.1",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.6.1.tgz",
-      "integrity": "sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw==",
+      "version": "7.7.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.7.0.tgz",
+      "integrity": "sha512-VEwHCMgMjD2WBsxeRGUE18RmzxT9Bn7ghDpzvTEvkLSBAKgTMydJjouZTjspgQfRHpPt/PB3EHWBa6SSyFQq4g==",
       "requires": {
         "d3-array": "3",
         "d3-axis": "3",
diff --git a/package.json b/package.json
index 4a224c3c697..b1a22e3304d 100644
--- a/package.json
+++ b/package.json
@@ -40,7 +40,7 @@
     "clipboard": "^2.0.11",
     "compression": "^1.7.4",
     "csso": "^5.0.5",
-    "d3": "^7.6.1",
+    "d3": "^7.7.0",
     "d3-node": "^3.0.0",
     "ejs": "^3.1.8",
     "emoji-name-map": "^1.2.9",

From 433d96b8da51b219f580bbb1abd5df6bc93a5841 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Wed, 7 Dec 2022 22:19:33 -0500
Subject: [PATCH 006/196] chore(deps): bump eslint from 8.27.0 to 8.29.0
 (#1306) [skip ci]

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3e1469e3e0e..09f72d6d11c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,7 +50,7 @@
         "xml-formatter": "^2.6.1"
       },
       "devDependencies": {
-        "eslint": "^8.27.0",
+        "eslint": "^8.29.0",
         "jest": "^29.3.1",
         "libxmljs2": "^0.31.0"
       },
@@ -5058,9 +5058,9 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.27.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz",
-      "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==",
+      "version": "8.29.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz",
+      "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==",
       "dev": true,
       "dependencies": {
         "@eslint/eslintrc": "^1.3.3",
@@ -14468,9 +14468,9 @@
       }
     },
     "eslint": {
-      "version": "8.27.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz",
-      "integrity": "sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==",
+      "version": "8.29.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz",
+      "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==",
       "dev": true,
       "requires": {
         "@eslint/eslintrc": "^1.3.3",
diff --git a/package.json b/package.json
index b1a22e3304d..697d977957a 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,7 @@
     "xml-formatter": "^2.6.1"
   },
   "devDependencies": {
-    "eslint": "^8.27.0",
+    "eslint": "^8.29.0",
     "jest": "^29.3.1",
     "libxmljs2": "^0.31.0"
   },

From 25a86558c31bade6e38815ef1e657ffcc70a4831 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 8 Dec 2022 00:46:50 -0500
Subject: [PATCH 007/196] ci: auto-regenerate files

---
 .github/scripts/files/examples.yml | 11 +----------
 .github/workflows/examples.yml     |  2 +-
 2 files changed, 2 insertions(+), 11 deletions(-)

diff --git a/.github/scripts/files/examples.yml b/.github/scripts/files/examples.yml
index 1829a315493..738698c060b 100644
--- a/.github/scripts/files/examples.yml
+++ b/.github/scripts/files/examples.yml
@@ -58,7 +58,7 @@ jobs:
         if: ${{ success() || failure() }}
         run: |
           set +e
-          rm -rf /metrics_renders/metrics.markdown*.{md,pdf}
+          sudo rm -rf /metrics_renders/github-metrics.*
           sudo mv /metrics_renders/* ./
           git config user.name github-actions[bot]
           git config user.email 41898282+github-actions[bot]@users.noreply.github.com
@@ -68,15 +68,6 @@ jobs:
           git commit -m "chore: update examples"
           git push --force
 
-          set +e
-          git config user.name github-actions[bot]
-          git config user.email 41898282+github-actions[bot]@users.noreply.github.com
-          git pull
-          sudo cp /metrics_renders/* ./
-          git add --all
-          git commit -m "chore: update examples"
-          git push --force
-
 # ======================================================================================
 # Special job used to render lowlighter/metrics repository assets
 # ======================================================================================
diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index c375d9efeca..e393458b617 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -1327,7 +1327,7 @@ jobs:
         if: ${{ success() || failure() }}
         run: |
           set +e
-          rm -rf /metrics_renders/metrics.markdown*.{md,pdf}
+          sudo rm -rf /metrics_renders/github-metrics.*
           sudo mv /metrics_renders/* ./
           git config user.name github-actions[bot]
           git config user.email 41898282+github-actions[bot]@users.noreply.github.com

From 32ca45d37d160e586bcedef0069a16d972e63f06 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 11 Dec 2022 20:13:36 -0500
Subject: [PATCH 008/196] feat(plugins/community/splatoon): upgrade s3si

---
 .../plugins/community/splatoon/s3si/index.ts  | 56 +++++++++++--------
 1 file changed, 34 insertions(+), 22 deletions(-)

diff --git a/source/plugins/community/splatoon/s3si/index.ts b/source/plugins/community/splatoon/s3si/index.ts
index 7cb9f94b025..203a64e1de7 100644
--- a/source/plugins/community/splatoon/s3si/index.ts
+++ b/source/plugins/community/splatoon/s3si/index.ts
@@ -12,9 +12,9 @@ class APIError extends Error {
     }
 }
 const AGENT_NAME = "s3si.ts";
-const S3SI_VERSION = "0.2.1";
+const S3SI_VERSION = "0.2.4";
 const NSOAPP_VERSION = "2.4.0";
-const WEB_VIEW_VERSION = "2.0.0-18810d39";
+const WEB_VIEW_VERSION = "2.0.0-bd36a652";
 const S3SI_LINK = "https://github.com/spacemeowx2/s3si.ts";
 const USERAGENT = `${AGENT_NAME}/${S3SI_VERSION} (${S3SI_LINK})`;
 const DEFAULT_APP_USER_AGENT = "Mozilla/5.0 (Linux; Android 11; Pixel 5) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/94.0.4606.61 Mobile Safari/537.36";
@@ -6194,10 +6194,10 @@ class StatInkExporter {
             special_uses
         };
     }
-    async mapCoop({ groupInfo , detail  }) {
-        const { dangerRate , resultWave , bossResult , myResult , memberResults , scale , playedTime , enemyResults , smellMeter  } = detail;
+    async mapCoop({ gradeBefore , groupInfo , detail  }) {
+        const { dangerRate , resultWave , bossResult , myResult , memberResults , scale , playedTime , enemyResults , smellMeter , waveResults  } = detail;
         const startedAt = Math.floor(new Date(playedTime).getTime() / 1000);
-        const golden_eggs = myResult.goldenDeliverCount + memberResults.reduce((acc, i)=>acc + i.goldenDeliverCount, 0);
+        const golden_eggs = waveResults.reduce((prev, i)=>prev + i.teamDeliverCount, 0);
         const power_eggs = myResult.deliverCount + memberResults.reduce((p, i)=>p + i.deliverCount, 0);
         const bosses = Object.fromEntries(enemyResults.map((i)=>[
                 b64Number(i.enemy.id),
@@ -6210,29 +6210,34 @@ class StatInkExporter {
         const title_after = detail.afterGrade ? b64Number(detail.afterGrade.id).toString() : undefined;
         const title_exp_after = detail.afterGradePoint;
         let clear_waves;
-        if (detail.waveResults.length > 0) {
-            clear_waves = detail.waveResults.filter((i)=>i.waveNumber < 4).length - 1 + (resultWave === 0 ? 1 : 0);
+        if (waveResults.length > 0) {
+            clear_waves = waveResults.filter((i)=>i.waveNumber < 4).length - 1 + (resultWave === 0 ? 1 : 0);
         } else {
             clear_waves = 0;
         }
         let title_before = undefined;
         let title_exp_before = undefined;
-        const expDiff = COOP_POINT_MAP[clear_waves];
-        if (nonNullable(title_after) && nonNullable(title_exp_after) && nonNullable(expDiff)) {
-            if (title_exp_after === 40 && expDiff === 20) {} else if (title_exp_after === 40 && expDiff < 0 && title_after !== "8") {} else if (title_exp_after === 999 && expDiff !== 0) {
-                title_before = title_after;
-            } else {
-                if (title_exp_after - expDiff >= 0) {
+        if (gradeBefore) {
+            title_before = b64Number(gradeBefore.grade.id).toString();
+            title_exp_before = gradeBefore.gradePoint;
+        } else {
+            const expDiff = COOP_POINT_MAP[clear_waves];
+            if (nonNullable(title_after) && nonNullable(title_exp_after) && nonNullable(expDiff)) {
+                if (title_exp_after === 40 && expDiff === 20) {} else if (title_exp_after === 40 && expDiff < 0 && title_after !== "8") {} else if (title_exp_after === 999 && expDiff !== 0) {
                     title_before = title_after;
-                    title_exp_before = title_exp_after - expDiff;
                 } else {
-                    title_before = (parseInt(title_after) - 1).toString();
+                    if (title_exp_after - expDiff >= 0) {
+                        title_before = title_after;
+                        title_exp_before = title_exp_after - expDiff;
+                    } else {
+                        title_before = (parseInt(title_after) - 1).toString();
+                    }
                 }
             }
         }
         let fail_reason = null;
-        if (clear_waves !== 3 && detail.waveResults.length > 0) {
-            const lastWave = detail.waveResults[detail.waveResults.length - 1];
+        if (clear_waves !== 3 && waveResults.length > 0) {
+            const lastWave = waveResults[waveResults.length - 1];
             if (lastWave.teamDeliverCount >= lastWave.deliverNorm) {
                 fail_reason = "wipe_out";
             }
@@ -6240,7 +6245,7 @@ class StatInkExporter {
         const result = {
             uuid: await gameId(detail.id),
             private: groupInfo?.mode === "PRIVATE_CUSTOM" ? "yes" : "no",
-            big_run: "no",
+            big_run: detail.rule === "BIG_RUN" ? "yes" : "no",
             stage: b64Number(detail.coopStage.id).toString(),
             danger_rate: dangerRate * 100,
             clear_waves,
@@ -6261,7 +6266,7 @@ class StatInkExporter {
             job_score: detail.jobScore,
             job_rate: detail.jobRate,
             job_bonus: detail.jobBonus,
-            waves: await Promise.all(detail.waveResults.map((w)=>this.mapWave(w))),
+            waves: await Promise.all(waveResults.map((w)=>this.mapWave(w))),
             players: await Promise.all([
                 this.mapCoopPlayer(true, myResult),
                 ...memberResults.map((p)=>this.mapCoopPlayer(false, p))
@@ -6793,15 +6798,22 @@ class GameFetcher {
             return {
                 type: "CoopInfo",
                 listNode: null,
-                groupInfo: null
+                groupInfo: null,
+                gradeBefore: null
             };
         }
         const { historyDetails , ...groupInfo } = group;
-        const listNode = historyDetails.nodes.find((i)=>i.id === id) ?? null;
+        const listNodeIdx = historyDetails.nodes.findIndex((i)=>i.id === id) ?? null;
+        const listNode = listNodeIdx !== null ? historyDetails.nodes[listNodeIdx] : null;
+        const listNodeBefore = listNodeIdx !== null ? historyDetails.nodes[listNodeIdx + 1] ?? null : null;
         return {
             type: "CoopInfo",
             listNode,
-            groupInfo
+            groupInfo,
+            gradeBefore: listNodeBefore?.afterGrade && listNodeBefore.afterGradePoint ? {
+                grade: listNodeBefore.afterGrade,
+                gradePoint: listNodeBefore.afterGradePoint
+            } : null
         };
     }
     async getBattleMetaById(id, vsMode) {

From b4caf9a239cc594153cb04b03d263fbe11aa32d9 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 11 Dec 2022 21:24:12 -0500
Subject: [PATCH 009/196] feat(plugins/community/splatoon): add missing gears

---
 source/plugins/community/splatoon/assets.mjs | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/source/plugins/community/splatoon/assets.mjs b/source/plugins/community/splatoon/assets.mjs
index fc66714984a..d3ea03440fe 100644
--- a/source/plugins/community/splatoon/assets.mjs
+++ b/source/plugins/community/splatoon/assets.mjs
@@ -20,6 +20,8 @@ export default {
     "Sturgeon Shipyard": "https://cdn.wikimg.net/en/splatoonwiki/images/4/45/S3_Stage_Sturgeon_Shipyard.png",
     MakoMart: "https://cdn.wikimg.net/en/splatoonwiki/images/4/47/S3_Stage_MakoMart.png",
     "Wahoo World": "https://cdn.wikimg.net/en/splatoonwiki/images/7/71/S3_Stage_Wahoo_World.png",
+    "Brinewater Springs": "https://cdn.wikimg.net/en/splatoonwiki/images/b/bf/S3_Brinewater_Springs.png",
+    "Flounder Heights": "https://cdn.wikimg.net/en/splatoonwiki/images/2/23/S3_Stage_Flounder_Heights.png"
   },
   //Game modes
   modes: {
@@ -34,14 +36,19 @@ export default {
     ".52 Gal": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/e/e3/S3_Weapon_Main_.52_Gal_Flat.png/120px-S3_Weapon_Main_.52_Gal_Flat.png",
     ".96 Gal": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/88/S3_Weapon_Main_.96_Gal_Flat.png/120px-S3_Weapon_Main_.96_Gal_Flat.png",
     "Aerospray MG": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/0/0e/S3_Weapon_Main_Aerospray_MG_Flat.png/120px-S3_Weapon_Main_Aerospray_MG_Flat.png",
+    "Aerospray RG": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/2/27/S3_Weapon_Main_Aerospray_RG_Flat.png/120px-S3_Weapon_Main_Aerospray_RG_Flat.png",
     "Ballpoint Splatling": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/78/S3_Weapon_Main_Ballpoint_Splatling_Flat.png/120px-S3_Weapon_Main_Ballpoint_Splatling_Flat.png",
     "Bamboozler 14 Mk I": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a1/S3_Weapon_Main_Bamboozler_14_Mk_I_Flat.png/120px-S3_Weapon_Main_Bamboozler_14_Mk_I_Flat.png",
+    "Big Swig Roller": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/71/S3_Weapon_Main_Big_Swig_Roller_Flat.png/120px-S3_Weapon_Main_Big_Swig_Roller_Flat.png",
     Blaster: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/9/94/S3_Weapon_Main_Blaster_Flat.png/120px-S3_Weapon_Main_Blaster_Flat.png",
     Bloblobber: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/d/dd/S3_Weapon_Main_Bloblobber_Flat.png/120px-S3_Weapon_Main_Bloblobber_Flat.png",
+    "Carbon Roller Deco": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a7/S3_Weapon_Main_Carbon_Roller_Deco_Flat.png/120px-S3_Weapon_Main_Carbon_Roller_Deco_Flat.png",
     "Carbon Roller": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/77/S3_Weapon_Main_Carbon_Roller_Flat.png/120px-S3_Weapon_Main_Carbon_Roller_Flat.png",
     "Clash Blaster": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a3/S3_Weapon_Main_Clash_Blaster_Flat.png/120px-S3_Weapon_Main_Clash_Blaster_Flat.png",
     "Classic Squiffer": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/4/48/S3_Weapon_Main_Classic_Squiffer_Flat.png/120px-S3_Weapon_Main_Classic_Squiffer_Flat.png",
+    "Custom Splattershot Jr.": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/2/24/S3_Weapon_Main_Custom_Splattershot_Jr._Flat.png/120px-S3_Weapon_Main_Custom_Splattershot_Jr._Flat.png",
     "Dapple Dualies": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a0/S3_Weapon_Main_Dapple_Dualies_Flat.png/120px-S3_Weapon_Main_Dapple_Dualies_Flat.png",
+    "Dapple Dualies Nouveau": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a5/S3_Weapon_Main_Dapple_Dualies_Nouveau_Flat.png/120px-S3_Weapon_Main_Dapple_Dualies_Nouveau_Flat.png",
     "Dark Tetra Dualies": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/2/2a/S3_Weapon_Main_Dark_Tetra_Dualies_Flat.png/120px-S3_Weapon_Main_Dark_Tetra_Dualies_Flat.png",
     "Dualie Squelchers": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/0/05/S3_Weapon_Main_Dualie_Squelchers_Flat.png/120px-S3_Weapon_Main_Dualie_Squelchers_Flat.png",
     "Dynamo Roller": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/0/0d/S3_Weapon_Main_Dynamo_Roller_Flat.png/120px-S3_Weapon_Main_Dynamo_Roller_Flat.png",
@@ -49,12 +56,14 @@ export default {
     "E-liter 4K Scope": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/4/41/S3_Weapon_Main_E-liter_4K_Scope_Flat.png/120px-S3_Weapon_Main_E-liter_4K_Scope_Flat.png",
     Explosher: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/77/S3_Weapon_Main_Explosher_Flat.png/120px-S3_Weapon_Main_Explosher_Flat.png",
     "Flingza Roller": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/f/f3/S3_Weapon_Main_Flingza_Roller_Flat.png/120px-S3_Weapon_Main_Flingza_Roller_Flat.png",
+    "Forge Splattershot Pro": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/3/34/S3_Weapon_Main_Forge_Splattershot_Pro_Flat.png/120px-S3_Weapon_Main_Forge_Splattershot_Pro_Flat.png",
     "Glooga Dualies": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/8a/S3_Weapon_Main_Glooga_Dualies_Flat.png/120px-S3_Weapon_Main_Glooga_Dualies_Flat.png",
     "Goo Tuber": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a0/S3_Weapon_Main_Goo_Tuber_Flat.png/120px-S3_Weapon_Main_Goo_Tuber_Flat.png",
     "Grizzco Blaster": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/c/ca/S3_Weapon_Main_Grizzco_Blaster_Flat.png/120px-S3_Weapon_Main_Grizzco_Blaster_Flat.png",
     "Grizzco Brella": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/1/18/S3_Weapon_Main_Grizzco_Brella_Flat.png/120px-S3_Weapon_Main_Grizzco_Brella_Flat.png",
     "Grizzco Charger": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/5/5f/S3_Weapon_Main_Grizzco_Charger_Flat.png/120px-S3_Weapon_Main_Grizzco_Charger_Flat.png",
     "Grizzco Slosher": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/83/S3_Weapon_Main_Grizzco_Slosher_Flat.png/120px-S3_Weapon_Main_Grizzco_Slosher_Flat.png",
+    "Grizzco Splatana": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/e/eb/S3_Weapon_Main_Grizzco_Splatana_Flat.png/120px-S3_Weapon_Main_Grizzco_Splatana_Flat.png",
     "Grizzco Stringer": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/6/64/S3_Weapon_Main_Grizzco_Stringer_Flat.png/120px-S3_Weapon_Main_Grizzco_Stringer_Flat.png",
     "H-3 Nozzlenose": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/e/e6/S3_Weapon_Main_H-3_Nozzlenose_Flat.png/120px-S3_Weapon_Main_H-3_Nozzlenose_Flat.png",
     "Heavy Splatling": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/e/e4/S3_Weapon_Main_Heavy_Splatling_Flat.png/120px-S3_Weapon_Main_Heavy_Splatling_Flat.png",
@@ -62,9 +71,11 @@ export default {
     "Hero Shot Replica": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/4/49/S3_Weapon_Main_Hero_Shot_Replica_Flat.png/120px-S3_Weapon_Main_Hero_Shot_Replica_Flat.png",
     "Hydra Splatling": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/b/b3/S3_Weapon_Main_Hydra_Splatling_Flat.png/120px-S3_Weapon_Main_Hydra_Splatling_Flat.png",
     Inkbrush: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/e/e8/S3_Weapon_Main_Inkbrush_Flat.png/120px-S3_Weapon_Main_Inkbrush_Flat.png",
+    "Inkbrush Nouveau": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/4/47/S3_Weapon_Main_Inkbrush_Nouveau_Flat.png/120px-S3_Weapon_Main_Inkbrush_Nouveau_Flat.png",
     "Jet Squelcher": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/80/S3_Weapon_Main_Jet_Squelcher_Flat.png/120px-S3_Weapon_Main_Jet_Squelcher_Flat.png",
     "L-3 Nozzlenose": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/b/bd/S3_Weapon_Main_L-3_Nozzlenose_Flat.png/120px-S3_Weapon_Main_L-3_Nozzlenose_Flat.png",
     "Luna Blaster": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/8e/S3_Weapon_Main_Luna_Blaster_Flat.png/120px-S3_Weapon_Main_Luna_Blaster_Flat.png",
+    "Luna Blaster Neo": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/73/S3_Weapon_Main_Luna_Blaster_Neo_Flat.png/120px-S3_Weapon_Main_Luna_Blaster_Neo_Flat.png",
     "Mini Splatling": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/1/16/S3_Weapon_Main_Mini_Splatling_Flat.png/120px-S3_Weapon_Main_Mini_Splatling_Flat.png",
     "N-ZAP '85": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/9/97/S3_Weapon_Main_N-ZAP_%2785_Flat.png/120px-S3_Weapon_Main_N-ZAP_%2785_Flat.png",
     "Nautilus 47": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/b/be/S3_Weapon_Main_Nautilus_47_Flat.png/120px-S3_Weapon_Main_Nautilus_47_Flat.png",
@@ -73,8 +84,10 @@ export default {
     "Rapid Blaster": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/d/dc/S3_Weapon_Main_Rapid_Blaster_Flat.png/120px-S3_Weapon_Main_Rapid_Blaster_Flat.png",
     "Rapid Blaster Pro": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/71/S3_Weapon_Main_Rapid_Blaster_Pro_Flat.png/120px-S3_Weapon_Main_Rapid_Blaster_Pro_Flat.png",
     "REEF-LUX 450": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/6/68/S3_Weapon_Main_REEF-LUX_450_Flat.png/120px-S3_Weapon_Main_REEF-LUX_450_Flat.png",
+    "Slosher Deco": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/71/S3_Weapon_Main_Slosher_Deco_Flat.png/120px-S3_Weapon_Main_Slosher_Deco_Flat.png",
     Slosher: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/b/b8/S3_Weapon_Main_Slosher_Flat.png/120px-S3_Weapon_Main_Slosher_Flat.png",
     "Sloshing Machine": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/8c/S3_Weapon_Main_Sloshing_Machine_Flat.png/120px-S3_Weapon_Main_Sloshing_Machine_Flat.png",
+    "Snipewriter 5H": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/3/31/S3_Weapon_Main_Snipewriter_5H_Flat.png/120px-S3_Weapon_Main_Snipewriter_5H_Flat.png",
     "Splash-o-matic": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/85/S3_Weapon_Main_Splash-o-matic_Flat.png/120px-S3_Weapon_Main_Splash-o-matic_Flat.png",
     "Splat Brella": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/0/02/S3_Weapon_Main_Splat_Brella_Flat.png/120px-S3_Weapon_Main_Splat_Brella_Flat.png",
     "Splat Charger": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/4/43/S3_Weapon_Main_Splat_Charger_Flat.png/120px-S3_Weapon_Main_Splat_Charger_Flat.png",
@@ -85,13 +98,16 @@ export default {
     Splatterscope: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/82/S3_Weapon_Main_Splatterscope_Flat.png/120px-S3_Weapon_Main_Splatterscope_Flat.png",
     Splattershot: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/9/9c/S3_Weapon_Main_Splattershot_Flat.png/120px-S3_Weapon_Main_Splattershot_Flat.png",
     "Splattershot Jr.": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/0/04/S3_Weapon_Main_Splattershot_Jr._Flat.png/120px-S3_Weapon_Main_Splattershot_Jr._Flat.png",
+    "Splattershot Nova": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/1/1a/S3_Weapon_Main_Splattershot_Nova_Flat.png/120px-S3_Weapon_Main_Splattershot_Nova_Flat.png",
     "Splattershot Pro": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/b/bd/S3_Weapon_Main_Splattershot_Pro_Flat.png/120px-S3_Weapon_Main_Splattershot_Pro_Flat.png",
     "Sploosh-o-matic": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/0/01/S3_Weapon_Main_Sploosh-o-matic_Flat.png/120px-S3_Weapon_Main_Sploosh-o-matic_Flat.png",
     Squeezer: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/0/05/S3_Weapon_Main_Squeezer_Flat.png/120px-S3_Weapon_Main_Squeezer_Flat.png",
     "Tenta Brella": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/5/53/S3_Weapon_Main_Tenta_Brella_Flat.png/120px-S3_Weapon_Main_Tenta_Brella_Flat.png",
+    "Tentatek Splattershot": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/83/S3_Weapon_Main_Tentatek_Splattershot_Flat.png/120px-S3_Weapon_Main_Tentatek_Splattershot_Flat.png",
     "Tri-Slosher": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/0/0e/S3_Weapon_Main_Tri-Slosher_Flat.png/120px-S3_Weapon_Main_Tri-Slosher_Flat.png",
     "Tri-Stringer": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a9/S3_Weapon_Main_Tri-Stringer_Flat.png/120px-S3_Weapon_Main_Tri-Stringer_Flat.png",
     "Undercover Brella": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/8c/S3_Weapon_Main_Undercover_Brella_Flat.png/120px-S3_Weapon_Main_Undercover_Brella_Flat.png",
+    "Zink Mini Splatling": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/6/65/S3_Weapon_Main_Zink_Mini_Splatling_Flat.png/120px-S3_Weapon_Main_Zink_Mini_Splatling_Flat.png",
   },
   //Subweapons icons
   subweapons: {

From d5df4fff11b6c8ea64ef862cc267ac232951ea03 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 11 Dec 2022 21:27:15 -0500
Subject: [PATCH 010/196] chore(deps): upgrade dependencies

---
 package-lock.json | 196 +++++++++++++++++++++-------------------------
 package.json      |  12 +--
 2 files changed, 95 insertions(+), 113 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 09f72d6d11c..359e2a18101 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,12 +13,15 @@
         "@actions/core": "^1.10.0",
         "@actions/github": "^5.1.1",
         "@faker-js/faker": "^7.6.0",
+        "@googlemaps/google-maps-services-js": "^3.3.16",
         "@octokit/graphql": "^5.0.4",
         "@octokit/rest": "^19.0.5",
         "@primer/css": "^20.7.1",
         "@primer/octicons": "^17.9.0",
         "axios": "^1.1.3",
+        "chess.js": "^1.0.0-alpha.0",
         "clipboard": "^2.0.11",
+        "color": "^4.2.3",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
         "d3": "^7.7.0",
@@ -28,26 +31,30 @@
         "express": "^4.18.2",
         "express-rate-limit": "^6.7.0",
         "file-type": "^18.0.0",
+        "gifencoder": "^2.0.1",
         "js-yaml": "^4.1.0",
         "linguist-js": "^2.5.3",
-        "marked": "^4.2.1",
+        "marked": "^4.2.4",
         "memory-cache": "^0.2.0",
-        "minimatch": "^5.1.0",
+        "minimatch": "^5.1.1",
+        "node-chartist": "^1.0.5",
         "node-fetch": "^3.3.0",
         "open-graph-scraper": "^5.0.1",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^19.3.0",
+        "puppeteer": "^19.4.0",
         "purgecss": "^5.0.0",
+        "rss": "^1.2.2",
         "rss-parser": "^3.12.0",
         "sanitize-html": "^2.7.3",
-        "sharp": "^0.31.1",
-        "simple-git": "^3.15.0",
-        "svgo": "^3.0.0",
+        "sharp": "^0.31.2",
+        "simple-git": "^3.15.1",
+        "svgo": "^3.0.2",
         "twemoji-parser": "^14.0.0",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
-        "xml-formatter": "^2.6.1"
+        "xml-formatter": "^2.6.1",
+        "yargs-parser": "^21.1.1"
       },
       "devDependencies": {
         "eslint": "^8.29.0",
@@ -2079,11 +2086,6 @@
       "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
       "devOptional": true
     },
-    "node_modules/@types/parse-json": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
-      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
-    },
     "node_modules/@types/prettier": {
       "version": "2.7.1",
       "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
@@ -3384,18 +3386,17 @@
       "optional": true
     },
     "node_modules/cosmiconfig": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
-      "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz",
+      "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==",
       "dependencies": {
-        "@types/parse-json": "^4.0.0",
         "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
         "parse-json": "^5.0.0",
-        "path-type": "^4.0.0",
-        "yaml": "^1.10.0"
+        "path-type": "^4.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=14"
       }
     },
     "node_modules/cross-fetch": {
@@ -4746,9 +4747,9 @@
       }
     },
     "node_modules/devtools-protocol": {
-      "version": "0.0.1056733",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1056733.tgz",
-      "integrity": "sha512-CmTu6SQx2g3TbZzDCAV58+LTxVdKplS7xip0g5oDXpZ+isr0rv5dDP8ToyVRywzPHkCCPKgKgScEcwz4uPWDIA=="
+      "version": "0.0.1068969",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1068969.tgz",
+      "integrity": "sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ=="
     },
     "node_modules/diff-sequences": {
       "version": "29.3.1",
@@ -7570,9 +7571,9 @@
       }
     },
     "node_modules/marked": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.1.tgz",
-      "integrity": "sha512-VK1/jNtwqDLvPktNpL0Fdg3qoeUZhmRsuiIjPEy/lHwXW4ouLoZfO4XoWd4ClDt+hupV1VLpkZhEovjU0W/kqA==",
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.4.tgz",
+      "integrity": "sha512-Wcc9ikX7Q5E4BYDPvh1C6QNSxrjC9tBgz+A/vAhp59KXUgachw++uMvMKiSW8oA85nopmPZcEvBoex/YLMsiyA==",
       "bin": {
         "marked": "bin/marked.js"
       },
@@ -7708,9 +7709,9 @@
       }
     },
     "node_modules/minimatch": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
-      "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz",
+      "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -8547,30 +8548,30 @@
       }
     },
     "node_modules/puppeteer": {
-      "version": "19.3.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.3.0.tgz",
-      "integrity": "sha512-WJbi/ULaeuFOz7cfMgJlJCBAZiyqIFeQ6os4h5ex3PVTt2qosXgwI9eruFZqFAwJRv8x5pOuMhWR0aSRgyDqEg==",
+      "version": "19.4.0",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.4.0.tgz",
+      "integrity": "sha512-sRzWEfFSZCCcFUJflGtYI2V7A6qK4Jht+2JiI2LZgn+Nv/LOZZsBDEaGl98ZrS8oEcUA5on4p2yJbE0nzHNzIg==",
       "hasInstallScript": true,
       "dependencies": {
-        "cosmiconfig": "7.0.1",
-        "devtools-protocol": "0.0.1056733",
+        "cosmiconfig": "8.0.0",
+        "devtools-protocol": "0.0.1068969",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.3.0"
+        "puppeteer-core": "19.4.0"
       },
       "engines": {
         "node": ">=14.1.0"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "19.3.0",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.3.0.tgz",
-      "integrity": "sha512-P8VAAOBnBJo/7DKJnj1b0K9kZBF2D8lkdL94CjJ+DZKCp182LQqYemPI9omUSZkh4bgykzXjZhaVR1qtddTTQg==",
+      "version": "19.4.0",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.4.0.tgz",
+      "integrity": "sha512-gG/jxseleZStinBn86x8r7trjcE4jcjx1hIQWOpACQhquHYMuKnrWxkzg+EDn8sN3wUtF/Ry9mtJgjM49oUOFQ==",
       "dependencies": {
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
-        "devtools-protocol": "0.0.1056733",
+        "devtools-protocol": "0.0.1068969",
         "extract-zip": "2.0.1",
         "https-proxy-agent": "5.0.1",
         "proxy-from-env": "1.1.0",
@@ -9144,9 +9145,9 @@
       "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
     },
     "node_modules/semver": {
-      "version": "7.3.7",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+      "version": "7.3.8",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -9217,16 +9218,16 @@
       "optional": true
     },
     "node_modules/sharp": {
-      "version": "0.31.1",
-      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.1.tgz",
-      "integrity": "sha512-GR8M1wBwOiFKLkm9JPun27OQnNRZdHfSf9VwcdZX6UrRmM1/XnOrLFTF0GAil+y/YK4E6qcM/ugxs80QirsHxg==",
+      "version": "0.31.2",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.2.tgz",
+      "integrity": "sha512-DUdNVEXgS5A97cTagSLIIp8dUZ/lZtk78iNVZgHdHbx1qnQR7JAHY0BnXnwwH39Iw+VKhO08CTYhIg0p98vQ5Q==",
       "hasInstallScript": true,
       "dependencies": {
         "color": "^4.2.3",
         "detect-libc": "^2.0.1",
         "node-addon-api": "^5.0.0",
         "prebuild-install": "^7.1.1",
-        "semver": "^7.3.7",
+        "semver": "^7.3.8",
         "simple-get": "^4.0.1",
         "tar-fs": "^2.1.1",
         "tunnel-agent": "^0.6.0"
@@ -9365,9 +9366,9 @@
       }
     },
     "node_modules/simple-git": {
-      "version": "3.15.0",
-      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.15.0.tgz",
-      "integrity": "sha512-FiWoMPlcYHQ+ApRihUsGjC/ZmIlWj62S6MBCwOunczvXcLQt+9ZdrysDrR6QVepkRQfEAaBXrN2QtJKrN6zbtg==",
+      "version": "3.15.1",
+      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.15.1.tgz",
+      "integrity": "sha512-73MVa5984t/JP4JcQt0oZlKGr42ROYWC3BcUZfuHtT3IHKPspIvL0cZBnvPXF7LL3S/qVeVHVdYYmJ3LOTw4Rg==",
       "dependencies": {
         "@kwsites/file-exists": "^1.1.1",
         "@kwsites/promise-deferred": "^1.1.1",
@@ -9762,9 +9763,9 @@
       }
     },
     "node_modules/svgo": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.0.tgz",
-      "integrity": "sha512-mSqPn6RDeNqJvCeqHERlfWJjd4crP/2PgFelil9WpTwC4D3okAUopPsH3lnEyl7ONXfDVyISOihDjO0uK8YVAA==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz",
+      "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==",
       "dependencies": {
         "@trysound/sax": "0.2.0",
         "commander": "^7.2.0",
@@ -10496,14 +10497,6 @@
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
     },
-    "node_modules/yaml": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
-      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/yargs": {
       "version": "17.6.2",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz",
@@ -12181,11 +12174,6 @@
       "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
       "devOptional": true
     },
-    "@types/parse-json": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz",
-      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
-    },
     "@types/prettier": {
       "version": "2.7.1",
       "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
@@ -13165,15 +13153,14 @@
       "optional": true
     },
     "cosmiconfig": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
-      "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz",
+      "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==",
       "requires": {
-        "@types/parse-json": "^4.0.0",
         "import-fresh": "^3.2.1",
+        "js-yaml": "^4.1.0",
         "parse-json": "^5.0.0",
-        "path-type": "^4.0.0",
-        "yaml": "^1.10.0"
+        "path-type": "^4.0.0"
       }
     },
     "cross-fetch": {
@@ -14233,9 +14220,9 @@
       "dev": true
     },
     "devtools-protocol": {
-      "version": "0.0.1056733",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1056733.tgz",
-      "integrity": "sha512-CmTu6SQx2g3TbZzDCAV58+LTxVdKplS7xip0g5oDXpZ+isr0rv5dDP8ToyVRywzPHkCCPKgKgScEcwz4uPWDIA=="
+      "version": "0.0.1068969",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1068969.tgz",
+      "integrity": "sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ=="
     },
     "diff-sequences": {
       "version": "29.3.1",
@@ -16354,9 +16341,9 @@
       }
     },
     "marked": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.1.tgz",
-      "integrity": "sha512-VK1/jNtwqDLvPktNpL0Fdg3qoeUZhmRsuiIjPEy/lHwXW4ouLoZfO4XoWd4ClDt+hupV1VLpkZhEovjU0W/kqA=="
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.4.tgz",
+      "integrity": "sha512-Wcc9ikX7Q5E4BYDPvh1C6QNSxrjC9tBgz+A/vAhp59KXUgachw++uMvMKiSW8oA85nopmPZcEvBoex/YLMsiyA=="
     },
     "matchmedia": {
       "version": "0.1.2",
@@ -16455,9 +16442,9 @@
       "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="
     },
     "minimatch": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
-      "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz",
+      "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==",
       "requires": {
         "brace-expansion": "^2.0.1"
       }
@@ -17069,26 +17056,26 @@
       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
     },
     "puppeteer": {
-      "version": "19.3.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.3.0.tgz",
-      "integrity": "sha512-WJbi/ULaeuFOz7cfMgJlJCBAZiyqIFeQ6os4h5ex3PVTt2qosXgwI9eruFZqFAwJRv8x5pOuMhWR0aSRgyDqEg==",
+      "version": "19.4.0",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.4.0.tgz",
+      "integrity": "sha512-sRzWEfFSZCCcFUJflGtYI2V7A6qK4Jht+2JiI2LZgn+Nv/LOZZsBDEaGl98ZrS8oEcUA5on4p2yJbE0nzHNzIg==",
       "requires": {
-        "cosmiconfig": "7.0.1",
-        "devtools-protocol": "0.0.1056733",
+        "cosmiconfig": "8.0.0",
+        "devtools-protocol": "0.0.1068969",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.3.0"
+        "puppeteer-core": "19.4.0"
       }
     },
     "puppeteer-core": {
-      "version": "19.3.0",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.3.0.tgz",
-      "integrity": "sha512-P8VAAOBnBJo/7DKJnj1b0K9kZBF2D8lkdL94CjJ+DZKCp182LQqYemPI9omUSZkh4bgykzXjZhaVR1qtddTTQg==",
+      "version": "19.4.0",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.4.0.tgz",
+      "integrity": "sha512-gG/jxseleZStinBn86x8r7trjcE4jcjx1hIQWOpACQhquHYMuKnrWxkzg+EDn8sN3wUtF/Ry9mtJgjM49oUOFQ==",
       "requires": {
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
-        "devtools-protocol": "0.0.1056733",
+        "devtools-protocol": "0.0.1068969",
         "extract-zip": "2.0.1",
         "https-proxy-agent": "5.0.1",
         "proxy-from-env": "1.1.0",
@@ -17519,9 +17506,9 @@
       "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
     },
     "semver": {
-      "version": "7.3.7",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
-      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+      "version": "7.3.8",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
       "requires": {
         "lru-cache": "^6.0.0"
       }
@@ -17582,15 +17569,15 @@
       "optional": true
     },
     "sharp": {
-      "version": "0.31.1",
-      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.1.tgz",
-      "integrity": "sha512-GR8M1wBwOiFKLkm9JPun27OQnNRZdHfSf9VwcdZX6UrRmM1/XnOrLFTF0GAil+y/YK4E6qcM/ugxs80QirsHxg==",
+      "version": "0.31.2",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.2.tgz",
+      "integrity": "sha512-DUdNVEXgS5A97cTagSLIIp8dUZ/lZtk78iNVZgHdHbx1qnQR7JAHY0BnXnwwH39Iw+VKhO08CTYhIg0p98vQ5Q==",
       "requires": {
         "color": "^4.2.3",
         "detect-libc": "^2.0.1",
         "node-addon-api": "^5.0.0",
         "prebuild-install": "^7.1.1",
-        "semver": "^7.3.7",
+        "semver": "^7.3.8",
         "simple-get": "^4.0.1",
         "tar-fs": "^2.1.1",
         "tunnel-agent": "^0.6.0"
@@ -17680,9 +17667,9 @@
       }
     },
     "simple-git": {
-      "version": "3.15.0",
-      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.15.0.tgz",
-      "integrity": "sha512-FiWoMPlcYHQ+ApRihUsGjC/ZmIlWj62S6MBCwOunczvXcLQt+9ZdrysDrR6QVepkRQfEAaBXrN2QtJKrN6zbtg==",
+      "version": "3.15.1",
+      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.15.1.tgz",
+      "integrity": "sha512-73MVa5984t/JP4JcQt0oZlKGr42ROYWC3BcUZfuHtT3IHKPspIvL0cZBnvPXF7LL3S/qVeVHVdYYmJ3LOTw4Rg==",
       "requires": {
         "@kwsites/file-exists": "^1.1.1",
         "@kwsites/promise-deferred": "^1.1.1",
@@ -17979,9 +17966,9 @@
       }
     },
     "svgo": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.0.tgz",
-      "integrity": "sha512-mSqPn6RDeNqJvCeqHERlfWJjd4crP/2PgFelil9WpTwC4D3okAUopPsH3lnEyl7ONXfDVyISOihDjO0uK8YVAA==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz",
+      "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==",
       "requires": {
         "@trysound/sax": "0.2.0",
         "commander": "^7.2.0",
@@ -18556,11 +18543,6 @@
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
     },
-    "yaml": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
-      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
-    },
     "yargs": {
       "version": "17.6.2",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz",
diff --git a/package.json b/package.json
index 697d977957a..cfbd0b16e3f 100644
--- a/package.json
+++ b/package.json
@@ -49,20 +49,20 @@
     "file-type": "^18.0.0",
     "js-yaml": "^4.1.0",
     "linguist-js": "^2.5.3",
-    "marked": "^4.2.1",
+    "marked": "^4.2.4",
     "memory-cache": "^0.2.0",
-    "minimatch": "^5.1.0",
+    "minimatch": "^5.1.1",
     "node-fetch": "^3.3.0",
     "open-graph-scraper": "^5.0.1",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^19.3.0",
+    "puppeteer": "^19.4.0",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.12.0",
     "sanitize-html": "^2.7.3",
-    "sharp": "^0.31.1",
-    "simple-git": "^3.15.0",
-    "svgo": "^3.0.0",
+    "sharp": "^0.31.2",
+    "simple-git": "^3.15.1",
+    "svgo": "^3.0.2",
     "twemoji-parser": "^14.0.0",
     "vue": "^2.7.1",
     "vue-prism-component": "^1.2.0",

From 3df41e5a3eac5d682c43eec8143ea693a597af2c Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 11 Dec 2022 21:59:56 -0500
Subject: [PATCH 011/196] feat(app/action): throw for fine-grained PAT (see
 #1292)

---
 source/app/action/index.mjs | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/source/app/action/index.mjs b/source/app/action/index.mjs
index 7912a01e756..f85bb553b67 100644
--- a/source/app/action/index.mjs
+++ b/source/app/action/index.mjs
@@ -171,9 +171,11 @@ function quit(reason) {
     info("GitHub token", token, {token: true})
     //A GitHub token should start with "gh" along an additional letter for type
     //See https://github.blog/2021-04-05-behind-githubs-new-authentication-token-formats
-    info("GitHub token format", /^gh[pousr]_/.test(token) ? "correct" : "(old or invalid)")
+    info("GitHub token format", /^github_pat_/.test(token) ? "fine-grained" : /^gh[pousr]_/.test(token) ? "classic" : "legacy or invalid")
     if (!token)
       throw new Error("You must provide a valid GitHub personal token to gather your metrics (see https://github.com/lowlighter/metrics/blob/master/.github/readme/partials/documentation/setup/action.md for more informations)")
+    if (/^github_pat_/.test(token))
+      throw new Error("It seems you're trying to use a fine-grained personal access token. These are currently unsupported as GitHub does not support them (yet?) for GraphQL API authentication (see https://docs.github.com/fr/graphql/guides/forming-calls-with-graphql#authenticating-with-graphql for more informations). Use a classic token instead.")
     conf.settings.token = token
     const api = {}
     const resources = {}

From 34cbcfd83111749888e2c722acc3ec6642b776a4 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 11 Dec 2022 22:27:28 -0500
Subject: [PATCH 012/196] fix(plugins/followup): possible negative width values
 [skip ci]

---
 source/templates/repository/partials/followup.ejs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/templates/repository/partials/followup.ejs b/source/templates/repository/partials/followup.ejs
index 24e07cd51f0..465e623a89a 100644
--- a/source/templates/repository/partials/followup.ejs
+++ b/source/templates/repository/partials/followup.ejs
@@ -33,7 +33,7 @@
                 {p:(skipped-collaborators.skipped)/count, fill:"#8B949E"},
                 {p:collaborators.skipped/count, fill:"#c9d1d9"},
               ]) { %>
-                <rect mask="url(#issues-bar)" x="<%= x %>" y="0" width="<%= p*width || 0 %>" height="8" fill="<%= fill %>"/>
+                <rect mask="url(#issues-bar)" x="<%= x %>" y="0" width="<%= Math.max(p*width || 0, 0) %>" height="8" fill="<%= fill %>"/>
               <% x += p*width }} %>
             </svg>
             <% if ((plugins.followup.indepth)&&(section.issues.collaborators)) { %>

From 77462c5d7474c57469ee0d6df8514361830e71ea Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 11 Dec 2022 22:40:49 -0500
Subject: [PATCH 013/196] fix(plugins/followup): possible negative width values
 [skip ci]

---
 source/templates/classic/partials/followup.ejs    | 4 ++--
 source/templates/repository/partials/followup.ejs | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/source/templates/classic/partials/followup.ejs b/source/templates/classic/partials/followup.ejs
index 95d4baa62b7..75edb2cd69f 100644
--- a/source/templates/classic/partials/followup.ejs
+++ b/source/templates/classic/partials/followup.ejs
@@ -36,7 +36,7 @@
                 {p:(skipped-collaborators.skipped)/count, fill:"#8B949E"},
                 {p:collaborators.skipped/count, fill:"#c9d1d9"},
               ]) { %>
-                <rect mask="url(#issues-bar)" x="<%= x %>" y="0" width="<%= p*width || 0 %>" height="8" fill="<%= fill %>"/>
+                <rect mask="url(#issues-bar)" x="<%= x %>" y="0" width="<%= Math.max(p*width || 0, 0) %>" height="8" fill="<%= fill %>"/>
               <% x += p*width }} %>
             </svg>
             <% if ((plugins.followup.indepth)&&(section.issues.collaborators)) { %>
@@ -105,7 +105,7 @@
                 {p:(merged-collaborators.merged)/count, fill:"#8957e5"},
                 {p:collaborators.merged/count, fill:"#d2a8ff"},
               ]) { %>
-                <rect mask="url(#issues-bar)" x="<%= x %>" y="0" width="<%= p*width || 0 %>" height="8" fill="<%= fill %>"/>
+                <rect mask="url(#issues-bar)" x="<%= x %>" y="0" width="<%= Math.max(p*width || 0, 0) %>" height="8" fill="<%= fill %>"/>
               <% x += p*width }} %>
             </svg>
             <% if ((plugins.followup.indepth)&&(section.pr.collaborators)) { %>
diff --git a/source/templates/repository/partials/followup.ejs b/source/templates/repository/partials/followup.ejs
index 465e623a89a..4e8b7b5a85d 100644
--- a/source/templates/repository/partials/followup.ejs
+++ b/source/templates/repository/partials/followup.ejs
@@ -102,7 +102,7 @@
                 {p:(merged-collaborators.merged)/count, fill:"#8957e5"},
                 {p:collaborators.merged/count, fill:"#d2a8ff"},
               ]) { %>
-                <rect mask="url(#issues-bar)" x="<%= x %>" y="0" width="<%= p*width || 0 %>" height="8" fill="<%= fill %>"/>
+                <rect mask="url(#issues-bar)" x="<%= x %>" y="0" width="<%= Math.max(p*width || 0, 0) %>" height="8" fill="<%= fill %>"/>
               <% x += p*width }} %>
             </svg>
             <% if ((plugins.followup.indepth)&&(section.pr.collaborators)) { %>

From b620ced64388eb7d828016e1ee235191e6e8f7d2 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 11 Dec 2022 23:08:37 -0500
Subject: [PATCH 014/196] ci: trigger


From de69a27dd69b165da0abd2071e22d4ce07d5bbec Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 12 Dec 2022 04:51:17 +0000
Subject: [PATCH 015/196] chore: code formatting

---
 source/plugins/community/splatoon/assets.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/community/splatoon/assets.mjs b/source/plugins/community/splatoon/assets.mjs
index d3ea03440fe..173488febde 100644
--- a/source/plugins/community/splatoon/assets.mjs
+++ b/source/plugins/community/splatoon/assets.mjs
@@ -21,7 +21,7 @@ export default {
     MakoMart: "https://cdn.wikimg.net/en/splatoonwiki/images/4/47/S3_Stage_MakoMart.png",
     "Wahoo World": "https://cdn.wikimg.net/en/splatoonwiki/images/7/71/S3_Stage_Wahoo_World.png",
     "Brinewater Springs": "https://cdn.wikimg.net/en/splatoonwiki/images/b/bf/S3_Brinewater_Springs.png",
-    "Flounder Heights": "https://cdn.wikimg.net/en/splatoonwiki/images/2/23/S3_Stage_Flounder_Heights.png"
+    "Flounder Heights": "https://cdn.wikimg.net/en/splatoonwiki/images/2/23/S3_Stage_Flounder_Heights.png",
   },
   //Game modes
   modes: {

From 83c40344423c13caa27a0181566b56a82c535d47 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 12 Dec 2022 21:29:47 -0500
Subject: [PATCH 016/196] chore: prepare release v3.30 (#1294) [skip ci]

---
 package-lock.json | 4 ++--
 package.json      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 359e2a18101..b419bd42ea4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "metrics",
-  "version": "3.30.0-beta",
+  "version": "3.30.0",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "metrics",
-      "version": "3.30.0-beta",
+      "version": "3.30.0",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index cfbd0b16e3f..3fdfee9f3a2 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "metrics",
-  "version": "3.30.0-beta",
+  "version": "3.30.0",
   "description": "An infographics generator with 40+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!",
   "main": "index.mjs",
   "scripts": {

From 374169c4a03499a0b5bf710fa711b442a9ad92f4 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 12 Dec 2022 21:30:41 -0500
Subject: [PATCH 017/196] ci: auto-regenerate files

---
 README.md | 2 --
 1 file changed, 2 deletions(-)

diff --git a/README.md b/README.md
index e619a8342c9..4f0fa5072e1 100644
--- a/README.md
+++ b/README.md
@@ -429,8 +429,6 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
 # 📚 Documentation
 
 
-> <sup>*⚠️ This is the documentation of **v3.30-beta** (`@master`/`@main` branches) which includes [unreleased features](https://github.com/lowlighter/metrics/compare/latest...master) planned for next release. See documentation for current released version [**v3.29** (`@latest` branch) here](https://github.com/lowlighter/metrics/blob/latest/README.md).* </sup>
-
 
 
 ## 🦮 Setup

From f99da6c94154d2a35384b004b2cfbd7cc83830b9 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 12 Dec 2022 21:30:53 -0500
Subject: [PATCH 018/196] Release v3.30 [release]


From 77fd4d044d73be31d346b22b88a384d7a0c764a1 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 13 Dec 2022 17:50:19 -0500
Subject: [PATCH 019/196] chore: create version 3.30-beta [skip ci]

---
 package-lock.json                          | 13 +++----------
 package.json                               |  2 +-
 source/app/web/statics/embed/index.html    |  8 ++++----
 source/app/web/statics/index.html          |  6 +++---
 source/app/web/statics/insights/index.html |  8 ++++----
 source/app/web/statics/oauth/index.html    |  8 ++++----
 6 files changed, 19 insertions(+), 26 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b419bd42ea4..141c279c753 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,27 +1,24 @@
 {
   "name": "metrics",
-  "version": "3.30.0",
+  "version": "3.31.0-beta",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "metrics",
-      "version": "3.30.0",
+      "version": "3.31.0-beta",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
         "@actions/core": "^1.10.0",
         "@actions/github": "^5.1.1",
         "@faker-js/faker": "^7.6.0",
-        "@googlemaps/google-maps-services-js": "^3.3.16",
         "@octokit/graphql": "^5.0.4",
         "@octokit/rest": "^19.0.5",
         "@primer/css": "^20.7.1",
         "@primer/octicons": "^17.9.0",
         "axios": "^1.1.3",
-        "chess.js": "^1.0.0-alpha.0",
         "clipboard": "^2.0.11",
-        "color": "^4.2.3",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
         "d3": "^7.7.0",
@@ -31,20 +28,17 @@
         "express": "^4.18.2",
         "express-rate-limit": "^6.7.0",
         "file-type": "^18.0.0",
-        "gifencoder": "^2.0.1",
         "js-yaml": "^4.1.0",
         "linguist-js": "^2.5.3",
         "marked": "^4.2.4",
         "memory-cache": "^0.2.0",
         "minimatch": "^5.1.1",
-        "node-chartist": "^1.0.5",
         "node-fetch": "^3.3.0",
         "open-graph-scraper": "^5.0.1",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
         "puppeteer": "^19.4.0",
         "purgecss": "^5.0.0",
-        "rss": "^1.2.2",
         "rss-parser": "^3.12.0",
         "sanitize-html": "^2.7.3",
         "sharp": "^0.31.2",
@@ -53,8 +47,7 @@
         "twemoji-parser": "^14.0.0",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
-        "xml-formatter": "^2.6.1",
-        "yargs-parser": "^21.1.1"
+        "xml-formatter": "^2.6.1"
       },
       "devDependencies": {
         "eslint": "^8.29.0",
diff --git a/package.json b/package.json
index 3fdfee9f3a2..a42c3b4f299 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "metrics",
-  "version": "3.30.0",
+  "version": "3.31.0-beta",
   "description": "An infographics generator with 40+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!",
   "main": "index.mjs",
   "scripts": {
diff --git a/source/app/web/statics/embed/index.html b/source/app/web/statics/embed/index.html
index 8f397c9a291..6c84130eb27 100644
--- a/source/app/web/statics/embed/index.html
+++ b/source/app/web/statics/embed/index.html
@@ -8,8 +8,8 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.29">
-    <link rel="stylesheet" href="/.css/style.css?v=3.29">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.30">
+    <link rel="stylesheet" href="/.css/style.css?v=3.30">
     <link rel="stylesheet" href="/.css/style.prism.css" />
   </head>
   <body>
@@ -230,7 +230,7 @@
     <script src="/.js/vue.min.js"></script>
     <script src="/.js/vue.prism.min.js"></script>
     <script src="/.js/clipboard.min.js"></script>
-    <script src="/.js/embed/app.placeholder.js?v=3.29"></script>
-    <script src="/.js/embed/app.js?v=3.29"></script>
+    <script src="/.js/embed/app.placeholder.js?v=3.30"></script>
+    <script src="/.js/embed/app.js?v=3.30"></script>
   </body>
 </html>
\ No newline at end of file
diff --git a/source/app/web/statics/index.html b/source/app/web/statics/index.html
index 220c93d2272..9157a3f164a 100644
--- a/source/app/web/statics/index.html
+++ b/source/app/web/statics/index.html
@@ -8,8 +8,8 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.29">
-    <link rel="stylesheet" href="/.css/style.css?v=3.29">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.30">
+    <link rel="stylesheet" href="/.css/style.css?v=3.30">
   </head>
   <body>
     <!-- Vue app -->
@@ -100,6 +100,6 @@ <h2>
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/.js/app.js?v=3.29"></script>
+    <script src="/.js/app.js?v=3.30"></script>
   </body>
 </html>
\ No newline at end of file
diff --git a/source/app/web/statics/insights/index.html b/source/app/web/statics/insights/index.html
index af787126039..97787a61fa6 100644
--- a/source/app/web/statics/insights/index.html
+++ b/source/app/web/statics/insights/index.html
@@ -8,9 +8,9 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.29">
-    <link rel="stylesheet" href="/.css/style.css?v=3.29">
-    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.29">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.30">
+    <link rel="stylesheet" href="/.css/style.css?v=3.30">
+    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.30">
   </head>
   <body>
     <!-- Vue app -->
@@ -595,6 +595,6 @@ <h2>
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/insights/.statics/script.js?v=3.29"></script>
+    <script src="/insights/.statics/script.js?v=3.30"></script>
   </body>
 </html>
diff --git a/source/app/web/statics/oauth/index.html b/source/app/web/statics/oauth/index.html
index 389c4338a79..e3b12b1e2e2 100644
--- a/source/app/web/statics/oauth/index.html
+++ b/source/app/web/statics/oauth/index.html
@@ -8,9 +8,9 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.29">
-    <link rel="stylesheet" href="/.css/style.css?v=3.29">
-    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.29">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.30">
+    <link rel="stylesheet" href="/.css/style.css?v=3.30">
+    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.30">
   </head>
   <body>
     <!-- Vue app -->
@@ -105,6 +105,6 @@
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/.oauth/script.js?v=3.29"></script>
+    <script src="/.oauth/script.js?v=3.30"></script>
   </body>
 </html>

From 73c8e87dc7bb8f874eef1585add26cfef81fbd0a Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 13 Dec 2022 19:00:03 -0500
Subject: [PATCH 020/196] chore(deps): bump @primer/octicons from 17.9.0 to
 17.10.0 (#1316) [skip ci]

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 141c279c753..44dd09d1db9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,7 @@
         "@octokit/graphql": "^5.0.4",
         "@octokit/rest": "^19.0.5",
         "@primer/css": "^20.7.1",
-        "@primer/octicons": "^17.9.0",
+        "@primer/octicons": "^17.10.0",
         "axios": "^1.1.3",
         "clipboard": "^2.0.11",
         "compression": "^1.7.4",
@@ -1915,9 +1915,9 @@
       }
     },
     "node_modules/@primer/octicons": {
-      "version": "17.9.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.9.0.tgz",
-      "integrity": "sha512-B6y3VxPrF6U+GUjZR883NsstI7v/Qcup9puDG+fOJvCm8b7UXNl46TbRrctMCZnYlyIzUF3/SgjJhr5od/Y6sw==",
+      "version": "17.10.0",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.0.tgz",
+      "integrity": "sha512-rg+NfA4M/SFutVzsqGwGWoKgXpHpTAbnoGvyGbkswT7iLV0PBFGJRkV61MhC61wEEF4SErMiaH5tOQKlvgvV9A==",
       "dependencies": {
         "object-assign": "^4.1.1"
       }
@@ -12018,9 +12018,9 @@
       }
     },
     "@primer/octicons": {
-      "version": "17.9.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.9.0.tgz",
-      "integrity": "sha512-B6y3VxPrF6U+GUjZR883NsstI7v/Qcup9puDG+fOJvCm8b7UXNl46TbRrctMCZnYlyIzUF3/SgjJhr5od/Y6sw==",
+      "version": "17.10.0",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.0.tgz",
+      "integrity": "sha512-rg+NfA4M/SFutVzsqGwGWoKgXpHpTAbnoGvyGbkswT7iLV0PBFGJRkV61MhC61wEEF4SErMiaH5tOQKlvgvV9A==",
       "requires": {
         "object-assign": "^4.1.1"
       }
diff --git a/package.json b/package.json
index a42c3b4f299..1c200eeb538 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
     "@octokit/graphql": "^5.0.4",
     "@octokit/rest": "^19.0.5",
     "@primer/css": "^20.7.1",
-    "@primer/octicons": "^17.9.0",
+    "@primer/octicons": "^17.10.0",
     "axios": "^1.1.3",
     "clipboard": "^2.0.11",
     "compression": "^1.7.4",

From 3a4559e6ed4821c9659a92f696e6fbc920309709 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 13 Dec 2022 19:43:57 -0500
Subject: [PATCH 021/196] chore(deps): bump sanitize-html from 2.7.3 to 2.8.0
 (#1311) [skip ci]

---
 package-lock.json | 457 +++++++++-------------------------------------
 package.json      |   2 +-
 2 files changed, 92 insertions(+), 367 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 44dd09d1db9..bbf4a0b3347 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -40,7 +40,7 @@
         "puppeteer": "^19.4.0",
         "purgecss": "^5.0.0",
         "rss-parser": "^3.12.0",
-        "sanitize-html": "^2.7.3",
+        "sanitize-html": "^2.8.0",
         "sharp": "^0.31.2",
         "simple-git": "^3.15.1",
         "svgo": "^3.0.2",
@@ -2984,126 +2984,6 @@
         "url": "https://github.com/sponsors/fb55"
       }
     },
-    "node_modules/cheerio-select/node_modules/dom-serializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
-      "dependencies": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
-        "entities": "^4.2.0"
-      },
-      "funding": {
-        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
-      }
-    },
-    "node_modules/cheerio-select/node_modules/domhandler": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-      "dependencies": {
-        "domelementtype": "^2.3.0"
-      },
-      "engines": {
-        "node": ">= 4"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domhandler?sponsor=1"
-      }
-    },
-    "node_modules/cheerio-select/node_modules/domutils": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
-      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
-      "dependencies": {
-        "dom-serializer": "^2.0.0",
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domutils?sponsor=1"
-      }
-    },
-    "node_modules/cheerio-select/node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/cheerio/node_modules/dom-serializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
-      "dependencies": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
-        "entities": "^4.2.0"
-      },
-      "funding": {
-        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
-      }
-    },
-    "node_modules/cheerio/node_modules/domhandler": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-      "dependencies": {
-        "domelementtype": "^2.3.0"
-      },
-      "engines": {
-        "node": ">= 4"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domhandler?sponsor=1"
-      }
-    },
-    "node_modules/cheerio/node_modules/domutils": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
-      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
-      "dependencies": {
-        "dom-serializer": "^2.0.0",
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domutils?sponsor=1"
-      }
-    },
-    "node_modules/cheerio/node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/cheerio/node_modules/htmlparser2": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
-      "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
-      "funding": [
-        "https://github.com/fb55/htmlparser2?sponsor=1",
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fb55"
-        }
-      ],
-      "dependencies": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
-        "domutils": "^3.0.1",
-        "entities": "^4.3.0"
-      }
-    },
     "node_modules/chess.js": {
       "version": "1.0.0-alpha.0",
       "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.0.0-alpha.0.tgz",
@@ -3474,57 +3354,6 @@
         "url": "https://github.com/sponsors/fb55"
       }
     },
-    "node_modules/css-select/node_modules/dom-serializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
-      "dependencies": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
-        "entities": "^4.2.0"
-      },
-      "funding": {
-        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
-      }
-    },
-    "node_modules/css-select/node_modules/domhandler": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-      "dependencies": {
-        "domelementtype": "^2.3.0"
-      },
-      "engines": {
-        "node": ">= 4"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domhandler?sponsor=1"
-      }
-    },
-    "node_modules/css-select/node_modules/domutils": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
-      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
-      "dependencies": {
-        "dom-serializer": "^2.0.0",
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.1"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domutils?sponsor=1"
-      }
-    },
-    "node_modules/css-select/node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
     "node_modules/css-tree": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
@@ -4766,18 +4595,29 @@
       }
     },
     "node_modules/dom-serializer": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
-      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
       "dependencies": {
-        "domelementtype": "^2.0.1",
-        "domhandler": "^4.2.0",
-        "entities": "^2.0.0"
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
       },
       "funding": {
         "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
       }
     },
+    "node_modules/dom-serializer/node_modules/entities": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
     "node_modules/domelementtype": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
@@ -4809,11 +4649,11 @@
       }
     },
     "node_modules/domhandler": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz",
-      "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==",
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
       "dependencies": {
-        "domelementtype": "^2.2.0"
+        "domelementtype": "^2.3.0"
       },
       "engines": {
         "node": ">= 4"
@@ -4823,13 +4663,13 @@
       }
     },
     "node_modules/domutils": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz",
-      "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
+      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
       "dependencies": {
-        "dom-serializer": "^1.0.1",
-        "domelementtype": "^2.2.0",
-        "domhandler": "^4.2.0"
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.1"
       },
       "funding": {
         "url": "https://github.com/fb55/domutils?sponsor=1"
@@ -6130,9 +5970,9 @@
       "dev": true
     },
     "node_modules/htmlparser2": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
-      "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
+      "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
       "funding": [
         "https://github.com/fb55/htmlparser2?sponsor=1",
         {
@@ -6141,10 +5981,21 @@
         }
       ],
       "dependencies": {
-        "domelementtype": "^2.0.1",
-        "domhandler": "^4.0.0",
-        "domutils": "^2.5.2",
-        "entities": "^2.0.0"
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "domutils": "^3.0.1",
+        "entities": "^4.3.0"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/entities": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+      "engines": {
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
     "node_modules/http-cache-semantics": {
@@ -8194,20 +8045,6 @@
         "url": "https://github.com/inikulin/parse5?sponsor=1"
       }
     },
-    "node_modules/parse5-htmlparser2-tree-adapter/node_modules/domhandler": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-      "dependencies": {
-        "domelementtype": "^2.3.0"
-      },
-      "engines": {
-        "node": ">= 4"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/domhandler?sponsor=1"
-      }
-    },
     "node_modules/parse5/node_modules/entities": {
       "version": "4.4.0",
       "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
@@ -9104,13 +8941,13 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "node_modules/sanitize-html": {
-      "version": "2.7.3",
-      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.3.tgz",
-      "integrity": "sha512-jMaHG29ak4miiJ8wgqA1849iInqORgNv7SLfSw9LtfOhEUQ1C0YHKH73R+hgyufBW9ZFeJrb057k9hjlfBCVlw==",
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.0.tgz",
+      "integrity": "sha512-ZsGyc6avnqgvEm3eMKrcy8xa7WM1MrGrfkGsUgQee2CU+vg3PCfNCexXwBDF/6dEPvaQ4k/QqRjnYKHL8xgNjg==",
       "dependencies": {
         "deepmerge": "^4.2.2",
         "escape-string-regexp": "^4.0.0",
-        "htmlparser2": "^6.0.0",
+        "htmlparser2": "^8.0.0",
         "is-plain-object": "^5.0.0",
         "parse-srcset": "^1.0.2",
         "postcss": "^8.3.11"
@@ -12836,52 +12673,6 @@
         "htmlparser2": "^8.0.1",
         "parse5": "^7.0.0",
         "parse5-htmlparser2-tree-adapter": "^7.0.0"
-      },
-      "dependencies": {
-        "dom-serializer": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-          "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
-          "requires": {
-            "domelementtype": "^2.3.0",
-            "domhandler": "^5.0.2",
-            "entities": "^4.2.0"
-          }
-        },
-        "domhandler": {
-          "version": "5.0.3",
-          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-          "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-          "requires": {
-            "domelementtype": "^2.3.0"
-          }
-        },
-        "domutils": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
-          "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
-          "requires": {
-            "dom-serializer": "^2.0.0",
-            "domelementtype": "^2.3.0",
-            "domhandler": "^5.0.1"
-          }
-        },
-        "entities": {
-          "version": "4.4.0",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
-        },
-        "htmlparser2": {
-          "version": "8.0.1",
-          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
-          "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
-          "requires": {
-            "domelementtype": "^2.3.0",
-            "domhandler": "^5.0.2",
-            "domutils": "^3.0.1",
-            "entities": "^4.3.0"
-          }
-        }
       }
     },
     "cheerio-select": {
@@ -12895,41 +12686,6 @@
         "domelementtype": "^2.3.0",
         "domhandler": "^5.0.3",
         "domutils": "^3.0.1"
-      },
-      "dependencies": {
-        "dom-serializer": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-          "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
-          "requires": {
-            "domelementtype": "^2.3.0",
-            "domhandler": "^5.0.2",
-            "entities": "^4.2.0"
-          }
-        },
-        "domhandler": {
-          "version": "5.0.3",
-          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-          "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-          "requires": {
-            "domelementtype": "^2.3.0"
-          }
-        },
-        "domutils": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
-          "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
-          "requires": {
-            "dom-serializer": "^2.0.0",
-            "domelementtype": "^2.3.0",
-            "domhandler": "^5.0.1"
-          }
-        },
-        "entities": {
-          "version": "4.4.0",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
-        }
       }
     },
     "chess.js": {
@@ -13221,41 +12977,6 @@
         "domhandler": "^5.0.2",
         "domutils": "^3.0.1",
         "nth-check": "^2.0.1"
-      },
-      "dependencies": {
-        "dom-serializer": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-          "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
-          "requires": {
-            "domelementtype": "^2.3.0",
-            "domhandler": "^5.0.2",
-            "entities": "^4.2.0"
-          }
-        },
-        "domhandler": {
-          "version": "5.0.3",
-          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-          "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-          "requires": {
-            "domelementtype": "^2.3.0"
-          }
-        },
-        "domutils": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
-          "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
-          "requires": {
-            "dom-serializer": "^2.0.0",
-            "domelementtype": "^2.3.0",
-            "domhandler": "^5.0.1"
-          }
-        },
-        "entities": {
-          "version": "4.4.0",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
-        }
       }
     },
     "css-tree": {
@@ -14233,13 +13954,20 @@
       }
     },
     "dom-serializer": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
-      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
       "requires": {
-        "domelementtype": "^2.0.1",
-        "domhandler": "^4.2.0",
-        "entities": "^2.0.0"
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
+      },
+      "dependencies": {
+        "entities": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
+        }
       }
     },
     "domelementtype": {
@@ -14263,21 +13991,21 @@
       }
     },
     "domhandler": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.0.tgz",
-      "integrity": "sha512-zk7sgt970kzPks2Bf+dwT/PLzghLnsivb9CcxkvR8Mzr66Olr0Ofd8neSbglHJHaHa2MadfoSdNlKYAaafmWfA==",
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
       "requires": {
-        "domelementtype": "^2.2.0"
+        "domelementtype": "^2.3.0"
       }
     },
     "domutils": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.7.0.tgz",
-      "integrity": "sha512-8eaHa17IwJUPAiB+SoTYBo5mCdeMgdcAoXJ59m6DT1vw+5iLS3gNoqYaRowaBKtGVrOF1Jz4yDTgYKLK2kvfJg==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
+      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
       "requires": {
-        "dom-serializer": "^1.0.1",
-        "domelementtype": "^2.2.0",
-        "domhandler": "^4.2.0"
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.1"
       }
     },
     "duplexer2": {
@@ -15238,14 +14966,21 @@
       "dev": true
     },
     "htmlparser2": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
-      "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
+      "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
       "requires": {
-        "domelementtype": "^2.0.1",
-        "domhandler": "^4.0.0",
-        "domutils": "^2.5.2",
-        "entities": "^2.0.0"
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "domutils": "^3.0.1",
+        "entities": "^4.3.0"
+      },
+      "dependencies": {
+        "entities": {
+          "version": "4.4.0",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
+        }
       }
     },
     "http-cache-semantics": {
@@ -16808,16 +16543,6 @@
       "requires": {
         "domhandler": "^5.0.2",
         "parse5": "^7.0.0"
-      },
-      "dependencies": {
-        "domhandler": {
-          "version": "5.0.3",
-          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-          "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-          "requires": {
-            "domelementtype": "^2.3.0"
-          }
-        }
       }
     },
     "parseurl": {
@@ -17468,13 +17193,13 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "sanitize-html": {
-      "version": "2.7.3",
-      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.7.3.tgz",
-      "integrity": "sha512-jMaHG29ak4miiJ8wgqA1849iInqORgNv7SLfSw9LtfOhEUQ1C0YHKH73R+hgyufBW9ZFeJrb057k9hjlfBCVlw==",
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.0.tgz",
+      "integrity": "sha512-ZsGyc6avnqgvEm3eMKrcy8xa7WM1MrGrfkGsUgQee2CU+vg3PCfNCexXwBDF/6dEPvaQ4k/QqRjnYKHL8xgNjg==",
       "requires": {
         "deepmerge": "^4.2.2",
         "escape-string-regexp": "^4.0.0",
-        "htmlparser2": "^6.0.0",
+        "htmlparser2": "^8.0.0",
         "is-plain-object": "^5.0.0",
         "parse-srcset": "^1.0.2",
         "postcss": "^8.3.11"
diff --git a/package.json b/package.json
index 1c200eeb538..f19df9f4078 100644
--- a/package.json
+++ b/package.json
@@ -59,7 +59,7 @@
     "puppeteer": "^19.4.0",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.12.0",
-    "sanitize-html": "^2.7.3",
+    "sanitize-html": "^2.8.0",
     "sharp": "^0.31.2",
     "simple-git": "^3.15.1",
     "svgo": "^3.0.2",

From a90044266c8c0e803008b8c7b4fae353d35368ed Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 13 Dec 2022 19:44:11 -0500
Subject: [PATCH 022/196] feat(plugins/core): support new debug flags for
 puppeteer (#1317)

---
 source/app/metrics/index.mjs     | 23 ++++++++++++++++++++---
 source/app/metrics/utils.mjs     |  7 ++++---
 source/plugins/core/metadata.yml | 16 ++++++++++++++++
 3 files changed, 40 insertions(+), 6 deletions(-)

diff --git a/source/app/metrics/index.mjs b/source/app/metrics/index.mjs
index 33d991af829..f34c29cde81 100644
--- a/source/app/metrics/index.mjs
+++ b/source/app/metrics/index.mjs
@@ -38,11 +38,28 @@ export default async function metrics({login, q}, {graphql, rest, plugins, conf,
         }
         : null),
     }
+    const {"debug.flags":dflags, "experimental.features":_experimental, "config.order":_partials} = imports.metadata.plugins.core.inputs({account:"bypass", q})
     const extras = {css: imports.metadata.plugins.core.extras("extras_css", {...conf.settings, error: false}) ? q["extras.css"] ?? "" : "", js: imports.metadata.plugins.core.extras("extras_js", {...conf.settings, error: false}) ? q["extras.js"] ?? "" : ""}
     const data = {q, animated: true, large: false, base: {}, config: {}, errors: [], warnings, plugins: {}, computed: {}, extras, postscripts: []}
-    const experimental = new Set(decodeURIComponent(q["experimental.features"] ?? "").split(" ").map(x => x.trim().toLocaleLowerCase()).filter(x => x))
-    if (conf.settings["debug.headless"])
+    const experimental = new Set(_experimental)
+    if (conf.settings["debug.headless"]) {
       imports.puppeteer.headless = false
+      console.debug(`metrics/compute/${login} > disabled puppeteer headless mode`)
+    }
+    if ((conf.settings.debug)||(process.env.GITHUB_ACTIONS)) {
+      if (dflags.includes("--puppeteer-disable-headless")) {
+        imports.puppeteer.headless = false
+        console.debug(`metrics/compute/${login} > disabled puppeteer headless mode`)
+      }
+      if (dflags.includes("--puppeteer-debug")) {
+        process.env.DEBUG = "puppeteer:*"
+        console.debug(`metrics/compute/${login} > enabled puppeteer debugging`)
+      }
+      if (dflags.find(flag => flag.startsWith("--puppeteer-wait-"))) {
+        imports.puppeteer.events = dflags.filter(flag => flag.startsWith("--puppeteer-wait-")).map(flag => flag.replace("--puppeteer-wait-", ""))
+        console.debug(`metrics/compute/${login} > overridden puppeteer wait events [${imports.puppeteer.events}]`)
+      }
+    }
 
     //Metrics insights
     if (convert === "insights")
@@ -51,7 +68,7 @@ export default async function metrics({login, q}, {graphql, rest, plugins, conf,
     //Partial parts
     {
       data.partials = new Set([
-        ...decodeURIComponent(q["config.order"] ?? "").split(",").map(x => x.trim().toLocaleLowerCase()).filter(partial => partials.includes(partial)),
+        ..._partials.filter(partial => partials.includes(partial)),
         ...partials,
       ])
       console.debug(`metrics/compute/${login} > content order : ${[...data.partials]}`)
diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 161114c45fa..2e741e0380a 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -52,6 +52,7 @@ export const puppeteer = {
     })
   },
   headless: true,
+  events: ["load", "domcontentloaded", "networkidle2"],
 }
 
 /**Plural formatter */
@@ -492,7 +493,7 @@ export const svg = {
     console.debug("metrics/svg/pdf > loading svg")
     const page = await svg.resize.browser.newPage()
     page.on("console", ({_text: text}) => console.debug(`metrics/svg/pdf > puppeteer > ${text}`))
-    await page.setContent(`<main class="markdown-body">${rendered}</main>`, {waitUntil: ["load", "domcontentloaded", "networkidle2"]})
+    await page.setContent(`<main class="markdown-body">${rendered}</main>`, {waitUntil: puppeteer.events})
     console.debug("metrics/svg/pdf > loaded svg successfully")
     const margins = (Array.isArray(paddings) ? paddings : paddings.split(",")).join(" ")
     console.debug(`metrics/svg/pdf > margins set to ${margins}`)
@@ -537,7 +538,7 @@ export const svg = {
     page
       .on("console", message => console.debug(`metrics/svg/resize > puppeteer > ${message.text()}`))
       .on("pageerror", error => console.debug(`metrics/svg/resize > puppeteer > ${error.message}`))
-    await page.setContent(rendered, {waitUntil: ["load", "domcontentloaded", "networkidle2"]})
+    await page.setContent(rendered, {waitUntil: puppeteer.events})
     console.debug("metrics/svg/resize > loaded svg successfully")
     await page.addStyleTag({content: "body { margin: 0; padding: 0; }"})
     let mime = "image/svg+xml"
@@ -611,7 +612,7 @@ export const svg = {
     }
     //Compute hash
     const page = await svg.resize.browser.newPage()
-    await page.setContent(rendered, {waitUntil: ["load", "domcontentloaded", "networkidle2"]})
+    await page.setContent(rendered, {waitUntil: puppeteer.events})
     const data = await page.evaluate(async () => {
       document.querySelector("footer")?.remove()
       return document.querySelector("svg").outerHTML
diff --git a/source/plugins/core/metadata.yml b/source/plugins/core/metadata.yml
index 1458187393f..6da248addfd 100644
--- a/source/plugins/core/metadata.yml
+++ b/source/plugins/core/metadata.yml
@@ -538,6 +538,16 @@ inputs:
       - `--cakeday`: simulate registration anniversary
       - `--halloween`: enable halloween colors
       - `--error`: force render error
+      - `--puppeteer-debug`: enable puppeteer debug mode\*
+      - `--puppeteer-disable-headless`: disable puppeteer headless mode *(requires a graphical environment)*\*
+      - `--puppeteer-wait-load`: override puppeteer wait events\*
+      - `--puppeteer-wait-domcontentloaded`: override puppeteer wait events\*
+      - `--puppeteer-wait-networkidle0`: override puppeteer wait events\*
+      - `--puppeteer-wait-networkidle2`: override puppeteer wait events\*
+
+      > *\* 🌐 Web instances needs to have [`debug`](/source/plugins/core/README.md#debug) set in `settings.json` for these flags to be supported.*
+
+      > ⚠️ No backward compatibility is guaranteed for these features, they are only meant for debugging purposes.
     type: array
     format: space-separated
     default: ""
@@ -545,6 +555,12 @@ inputs:
       - --cakeday
       - --halloween
       - --error
+      - --puppeteer-debug
+      - --puppeteer-disable-headless
+      - --puppeteer-wait-load
+      - --puppeteer-wait-domcontentloaded
+      - --puppeteer-wait-networkidle0
+      - --puppeteer-wait-networkidle2
     testing: yes
     preset: no
 

From 9bf637ee6388747736fda5b5be643ed284546c19 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Wed, 14 Dec 2022 01:22:49 +0000
Subject: [PATCH 023/196] chore: code formatting

---
 source/app/metrics/index.mjs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/source/app/metrics/index.mjs b/source/app/metrics/index.mjs
index f34c29cde81..a1dd6c19f3e 100644
--- a/source/app/metrics/index.mjs
+++ b/source/app/metrics/index.mjs
@@ -38,7 +38,7 @@ export default async function metrics({login, q}, {graphql, rest, plugins, conf,
         }
         : null),
     }
-    const {"debug.flags":dflags, "experimental.features":_experimental, "config.order":_partials} = imports.metadata.plugins.core.inputs({account:"bypass", q})
+    const {"debug.flags": dflags, "experimental.features": _experimental, "config.order": _partials} = imports.metadata.plugins.core.inputs({account: "bypass", q})
     const extras = {css: imports.metadata.plugins.core.extras("extras_css", {...conf.settings, error: false}) ? q["extras.css"] ?? "" : "", js: imports.metadata.plugins.core.extras("extras_js", {...conf.settings, error: false}) ? q["extras.js"] ?? "" : ""}
     const data = {q, animated: true, large: false, base: {}, config: {}, errors: [], warnings, plugins: {}, computed: {}, extras, postscripts: []}
     const experimental = new Set(_experimental)
@@ -46,7 +46,7 @@ export default async function metrics({login, q}, {graphql, rest, plugins, conf,
       imports.puppeteer.headless = false
       console.debug(`metrics/compute/${login} > disabled puppeteer headless mode`)
     }
-    if ((conf.settings.debug)||(process.env.GITHUB_ACTIONS)) {
+    if ((conf.settings.debug) || (process.env.GITHUB_ACTIONS)) {
       if (dflags.includes("--puppeteer-disable-headless")) {
         imports.puppeteer.headless = false
         console.debug(`metrics/compute/${login} > disabled puppeteer headless mode`)

From 5100ebadfe1c4b43fcdceaf9ec601385896b67a4 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Wed, 14 Dec 2022 01:23:54 +0000
Subject: [PATCH 024/196] ci: auto-regenerate files

---
 README.md                                     |  2 ++
 source/plugins/community/screenshot/README.md |  6 ++----
 source/plugins/community/splatoon/README.md   | 18 +++++-------------
 source/plugins/core/README.md                 | 14 +++++++++++++-
 4 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/README.md b/README.md
index 4f0fa5072e1..f9eeebea2c0 100644
--- a/README.md
+++ b/README.md
@@ -429,6 +429,8 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
 # 📚 Documentation
 
 
+> <sup>*⚠️ This is the documentation of **v3.31-beta** (`@master`/`@main` branches) which includes [unreleased features](https://github.com/lowlighter/metrics/compare/latest...master) planned for next release. See documentation for current released version [**v3.30** (`@latest` branch) here](https://github.com/lowlighter/metrics/blob/latest/README.md).* </sup>
+
 
 
 ## 🦮 Setup
diff --git a/source/plugins/community/screenshot/README.md b/source/plugins/community/screenshot/README.md
index 35b7fb1299b..f0f56a967a7 100644
--- a/source/plugins/community/screenshot/README.md
+++ b/source/plugins/community/screenshot/README.md
@@ -81,8 +81,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>json</code>
+    <td nowrap="nowrap"><b>type:</b> <code>json</code>
 <br>
 <b>default:</b> <details><summary>→ Click to expand</summary><pre language="json"><code>{
   "width": 1280,
@@ -96,8 +95,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
diff --git a/source/plugins/community/splatoon/README.md b/source/plugins/community/splatoon/README.md
index 85e8b03a5d2..4fe9365c3e8 100644
--- a/source/plugins/community/splatoon/README.md
+++ b/source/plugins/community/splatoon/README.md
@@ -42,8 +42,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -54,7 +53,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.nintendo.splatnet</i></li>
@@ -73,8 +71,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> player, versus, salmon-run<br></td>
@@ -85,8 +82,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 6)</i>
@@ -99,8 +95,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 6)</i>
@@ -115,8 +110,7 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.statink</i></li>
 </ul>
@@ -131,7 +125,6 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -147,7 +140,6 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> splatnet<br>
diff --git a/source/plugins/core/README.md b/source/plugins/core/README.md
index fb67beeaa03..3a0a9952402 100644
--- a/source/plugins/core/README.md
+++ b/source/plugins/core/README.md
@@ -1116,7 +1116,19 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
 <li><code>--cakeday</code>: simulate registration anniversary</li>
 <li><code>--halloween</code>: enable halloween colors</li>
 <li><code>--error</code>: force render error</li>
+<li><code>--puppeteer-debug</code>: enable puppeteer debug mode*</li>
+<li><code>--puppeteer-disable-headless</code>: disable puppeteer headless mode <em>(requires a graphical environment)</em>*</li>
+<li><code>--puppeteer-wait-load</code>: override puppeteer wait events*</li>
+<li><code>--puppeteer-wait-domcontentloaded</code>: override puppeteer wait events*</li>
+<li><code>--puppeteer-wait-networkidle0</code>: override puppeteer wait events*</li>
+<li><code>--puppeteer-wait-networkidle2</code>: override puppeteer wait events*</li>
 </ul>
+<blockquote>
+<p><em>* 🌐 Web instances needs to have <a href="/source/plugins/core/README.md#debug"><code>debug</code></a> set in <code>settings.json</code> for these flags to be supported.</em></p>
+</blockquote>
+<blockquote>
+<p>⚠️ No backward compatibility is guaranteed for these features, they are only meant for debugging purposes.</p>
+</blockquote>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
@@ -1125,7 +1137,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
 <b>type:</b> <code>array</code>
 <i>(space-separated)</i>
 <br>
-<b>allowed values:</b><ul><li>--cakeday</li><li>--halloween</li><li>--error</li></ul></td>
+<b>allowed values:</b><ul><li>--cakeday</li><li>--halloween</li><li>--error</li><li>--puppeteer-debug</li><li>--puppeteer-disable-headless</li><li>--puppeteer-wait-load</li><li>--puppeteer-wait-domcontentloaded</li><li>--puppeteer-wait-networkidle0</li><li>--puppeteer-wait-networkidle2</li></ul></td>
   </tr>
   <tr>
     <td nowrap="nowrap"><h4><code>debug_print</code></h4></td>

From da3c978673d0bb07fa5fc24f8f9d0065b7863a0e Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 18 Dec 2022 17:00:32 -0500
Subject: [PATCH 025/196] fix(ci): issues marked wrongly as stale

---
 .github/workflows/stale.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 97ab2781074..908385b6cd1 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -12,6 +12,7 @@ jobs:
     steps:
       - uses: actions/stale@v6
         with:
+          days-before-stale: -1
           stale-pr-message: This pull request seems to be inactive and will be automatically closed in a few days if it remains without any activity.
           days-before-pr-stale: 21
           days-before-pr-close: 3

From 248ccb12370d3e2b20a06e6080047671e25985b1 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 18 Dec 2022 17:29:59 -0500
Subject: [PATCH 026/196] fix(plugins/community/stock): undefined quoteType

---
 source/plugins/community/stock/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/community/stock/index.mjs b/source/plugins/community/stock/index.mjs
index d34b55d995a..dbfb66b630c 100644
--- a/source/plugins/community/stock/index.mjs
+++ b/source/plugins/community/stock/index.mjs
@@ -16,7 +16,7 @@ export default async function({login, q, imports, data, account}, {enabled = fal
 
     //Query API for company informations
     console.debug(`metrics/compute/${login}/plugins > stock > querying api for company`)
-    const {data: {quoteType: {shortName: company}}} = await imports.axios.get("https://yh-finance.p.rapidapi.com/stock/v2/get-profile", {
+    const {data: {quoteType: {shortName: company} = {shortName:symbol}}} = await imports.axios.get("https://yh-finance.p.rapidapi.com/stock/v2/get-profile", {
       params: {symbol, region: "US"},
       headers: {"x-rapidapi-key": token},
     })

From b1d8d0c97173aefccf473a454e70d69c3c970d6a Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 18 Dec 2022 17:35:27 -0500
Subject: [PATCH 027/196] fix(plugins/music): spotify playlist mode

---
 source/plugins/music/index.mjs | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/source/plugins/music/index.mjs b/source/plugins/music/index.mjs
index 8da2adb4cf9..8a6ac9403f9 100644
--- a/source/plugins/music/index.mjs
+++ b/source/plugins/music/index.mjs
@@ -124,14 +124,14 @@ export default async function({login, imports, data, q, account}, {enabled = fal
           //Spotify
           case "spotify": {
             //Parse tracklist
-            await frame.waitForSelector("table")
+            await frame.waitForSelector("ol")
             tracks = [
               ...await frame.evaluate(() =>
-                [...document.querySelectorAll("table tr")].map(tr => ({
-                  name: tr.querySelector("td:nth-child(2) div div:nth-child(1)").innerText,
-                  artist: tr.querySelector("td:nth-child(2) div div:nth-child(2)").innerText,
+                [...document.querySelectorAll("ol li")].map(tr => ({
+                  name: tr.querySelector("h3").innerText,
+                  artist: tr.querySelector("h4").innerText,
                   //Spotify doesn't provide artworks so we fallback on playlist artwork instead
-                  artwork: window.getComputedStyle(document.querySelector("button[title=Play]")?.parentNode ?? document.querySelector("button").parentNode, null).backgroundImage.match(/^url\("(?<url>https:...+)"\)$/)?.groups?.url ?? null,
+                  artwork: window.getComputedStyle(document.querySelector("div[style^='--image-src:']") ?? null)?.backgroundImage.match(/^url\("(?<url>https:...+)"\)$/)?.groups?.url ?? null,
                 }))
               ),
             ]

From 7924b609f8b88383faddecb0f6ef8eedbedd19ce Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 18 Dec 2022 17:43:05 -0500
Subject: [PATCH 028/196] fix(app/metrics): SVGs broken on markdown templates
 (#1315)

---
 source/app/action/index.mjs | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/source/app/action/index.mjs b/source/app/action/index.mjs
index f85bb553b67..1e6ebf0a717 100644
--- a/source/app/action/index.mjs
+++ b/source/app/action/index.mjs
@@ -416,7 +416,16 @@ function quit(reason) {
       throw new Error("Could not render metrics")
     info("Status", "complete")
     info("MIME type", mime)
-    const buffer = Buffer.isBuffer(rendered) ? rendered : Buffer.from(typeof rendered === "object" ? JSON.stringify(rendered) : `${rendered}`)
+    const buffer = {
+      _content:null,
+      get content() {
+        return this._content
+      },
+      set content(value) {
+        this._content = Buffer.isBuffer(value) ? value : Buffer.from(typeof value === "object" ? JSON.stringify(value) : `${value}`)
+      }
+    }
+    buffer.content = rendered
 
     //Debug print
     if (dprint) {
@@ -461,7 +470,7 @@ function quit(reason) {
       info("Actions to perform", "(none)")
     else {
       await fs.mkdir(paths.dirname(paths.join("/renders", filename)), {recursive: true})
-      await fs.writeFile(paths.join("/renders", filename), buffer)
+      await fs.writeFile(paths.join("/renders", filename), buffer.content)
       info(`Save to /metrics_renders/${filename}`, "ok")
       info("Output action", _action)
     }
@@ -513,6 +522,7 @@ function quit(reason) {
             }
           }, {retries: retries_output_action, delay: retries_delay_output_action})
         }
+        buffer.content = rendered
       }
 
       //Check changes
@@ -529,7 +539,7 @@ function quit(reason) {
       //Upload to gist (this is done as user since committer_token may not have gist rights)
       if (committer.gist) {
         await retry(async () => {
-          await rest.gists.update({gist_id: committer.gist, files: {[filename]: {content: buffer.toString()}}})
+          await rest.gists.update({gist_id: committer.gist, files: {[filename]: {content: buffer.content.toString()}}})
           info(`Upload to gist ${committer.gist}`, "ok")
           committer.commit = false
         }, {retries: retries_output_action, delay: retries_delay_output_action})
@@ -542,7 +552,7 @@ function quit(reason) {
             ...github.context.repo,
             path: filename,
             message: committer.message,
-            content: buffer.toString("base64"),
+            content: buffer.content.toString("base64"),
             branch: committer.pr ? committer.head : committer.branch,
             ...(committer.sha ? {sha: committer.sha} : {}),
           })

From a1fe86bd0d4d10b51fb3ccb86bcb503fb18c610c Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Sun, 18 Dec 2022 23:22:52 +0000
Subject: [PATCH 029/196] chore: code formatting

---
 source/app/action/index.mjs              | 4 ++--
 source/plugins/community/stock/index.mjs | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/source/app/action/index.mjs b/source/app/action/index.mjs
index 1e6ebf0a717..e7d996215cf 100644
--- a/source/app/action/index.mjs
+++ b/source/app/action/index.mjs
@@ -417,13 +417,13 @@ function quit(reason) {
     info("Status", "complete")
     info("MIME type", mime)
     const buffer = {
-      _content:null,
+      _content: null,
       get content() {
         return this._content
       },
       set content(value) {
         this._content = Buffer.isBuffer(value) ? value : Buffer.from(typeof value === "object" ? JSON.stringify(value) : `${value}`)
-      }
+      },
     }
     buffer.content = rendered
 
diff --git a/source/plugins/community/stock/index.mjs b/source/plugins/community/stock/index.mjs
index dbfb66b630c..3d20489e3a1 100644
--- a/source/plugins/community/stock/index.mjs
+++ b/source/plugins/community/stock/index.mjs
@@ -16,7 +16,7 @@ export default async function({login, q, imports, data, account}, {enabled = fal
 
     //Query API for company informations
     console.debug(`metrics/compute/${login}/plugins > stock > querying api for company`)
-    const {data: {quoteType: {shortName: company} = {shortName:symbol}}} = await imports.axios.get("https://yh-finance.p.rapidapi.com/stock/v2/get-profile", {
+    const {data: {quoteType: {shortName: company} = {shortName: symbol}}} = await imports.axios.get("https://yh-finance.p.rapidapi.com/stock/v2/get-profile", {
       params: {symbol, region: "US"},
       headers: {"x-rapidapi-key": token},
     })

From bc6c206862822063e76c6e64387cf770f14323a7 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 19 Dec 2022 12:45:12 -0500
Subject: [PATCH 030/196] chore(deps): bump @primer/css from 20.7.1 to 20.8.0
 (#1327) [skip ci]

---
 package-lock.json | 188 +++++++++++++++++++++++++++++++++++++++++++---
 package.json      |   2 +-
 2 files changed, 180 insertions(+), 10 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index bbf4a0b3347..cf60a0afc6a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,7 +15,7 @@
         "@faker-js/faker": "^7.6.0",
         "@octokit/graphql": "^5.0.4",
         "@octokit/rest": "^19.0.5",
-        "@primer/css": "^20.7.1",
+        "@primer/css": "^20.8.0",
         "@primer/octicons": "^17.10.0",
         "axios": "^1.1.3",
         "clipboard": "^2.0.11",
@@ -818,6 +818,67 @@
         "npm": ">=6.0.0"
       }
     },
+    "node_modules/@github/auto-check-element": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@github/auto-check-element/-/auto-check-element-5.2.0.tgz",
+      "integrity": "sha512-YODZZUSeoZVJQ04p73MAohrEK37SJlVRDUTaFiPYse9K3z3bNEm+ekq5qYCIyDKGgX7hUhr3WZF35qHxr/zu0Q==",
+      "dependencies": {
+        "@github/mini-throttle": "^1.0.7"
+      }
+    },
+    "node_modules/@github/auto-check-element/node_modules/@github/mini-throttle": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-1.0.7.tgz",
+      "integrity": "sha512-1fzCDXpxI4J59pNmO0r0Y1g+R8Sa2B5ersce8AuFu5STMu7b++9osdedK0zWduYowBIgsPQZihJBN19WrAF64g=="
+    },
+    "node_modules/@github/auto-complete-element": {
+      "version": "3.3.4",
+      "resolved": "https://registry.npmjs.org/@github/auto-complete-element/-/auto-complete-element-3.3.4.tgz",
+      "integrity": "sha512-b9SBCLIQGfCI3G0pGYE8rBSUDON5iFKUgHXgAtVdgZii0dnLFxNl5tn1R/RaBEFdzBQPDl9vqu41TF/Hs3w8FA==",
+      "dependencies": {
+        "@github/combobox-nav": "^2.0.2"
+      }
+    },
+    "node_modules/@github/catalyst": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/@github/catalyst/-/catalyst-1.6.0.tgz",
+      "integrity": "sha512-u8A+DameixqpeyHzvnJWTGj+wfiskQOYHzSiJscCWVfMkIT3rxnbHMtGh3lMthaRY21nbUOK71WcsCnCrXhBJQ=="
+    },
+    "node_modules/@github/clipboard-copy-element": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.1.2.tgz",
+      "integrity": "sha512-L6CMrcA5we0udafvoSuRCE/Ci/3xrLWKYRGup2IlhxF771bQYsQ2EB1of182pI8ZWM4oxgwzu37+igMeoZjN/A=="
+    },
+    "node_modules/@github/combobox-nav": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.1.5.tgz",
+      "integrity": "sha512-dmG1PuppNKHnBBEcfylWDwj9SSxd/E/qd8mC1G/klQC3s7ps5q6JZ034mwkkG0LKfI+Y+UgEua/ROD776N400w=="
+    },
+    "node_modules/@github/details-menu-element": {
+      "version": "1.0.13",
+      "resolved": "https://registry.npmjs.org/@github/details-menu-element/-/details-menu-element-1.0.13.tgz",
+      "integrity": "sha512-gMkii86w/oUP5dq8yOWZn1sgbgtFj3AYETxxtpsqRggZktgd8te4+npAn4Hm+936c/lxmEzXqfjARL/CzGR4+w=="
+    },
+    "node_modules/@github/image-crop-element": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@github/image-crop-element/-/image-crop-element-5.0.0.tgz",
+      "integrity": "sha512-Vgm2OwWAs1ESoib/t5sjxsAYo6YTOxxAjWDRxswX7qrqoyCejTZ3hshdo4Ep5e+Mz/GVTZC3rdMtg06dk/eT4g=="
+    },
+    "node_modules/@github/mini-throttle": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-2.1.0.tgz",
+      "integrity": "sha512-iEeR2OdVCPkdIPUszL8gJnKNu4MR8ANh7y0u/LPyaatYezgaWxUZEzhFntloqQq+HE6MZkFy+cl+xzCNuljOdw=="
+    },
+    "node_modules/@github/relative-time-element": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.1.5.tgz",
+      "integrity": "sha512-WAf1EQV5Sn6jGuAIQur/ztKlEV9R+VHDNwqEbeaOb6s9fiwM5z7+ujlWNZtgFkDp3lF0H8D/f0vdiPlfHz0ZTQ=="
+    },
+    "node_modules/@github/tab-container-element": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@github/tab-container-element/-/tab-container-element-3.2.0.tgz",
+      "integrity": "sha512-to5ZJuywKK3KX53X1ifOcWjvUTQcBGdQ6Qkhm8L97xQ3ovICag1048M3YMpc+QSdr8xWeCBMnLeMnENqotB0Og=="
+    },
     "node_modules/@googlemaps/google-maps-services-js": {
       "version": "3.3.16",
       "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.16.tgz",
@@ -1903,12 +1964,18 @@
       "integrity": "sha512-VEd4A7sAneA4qWlrwdTT3WyodlfpSXZIyMYNpf8SA4Q1zOH4+1O2X5LuARQGBqCUDpG9SxDHV03ZLNUIg3xS1g==",
       "optional": true
     },
+    "node_modules/@primer/behaviors": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.1.tgz",
+      "integrity": "sha512-aMRDUQ350lk0FxtL5gJWPFHHOSSzDbJ6uNJVIt8XSqiGe1pxuW5mVVfrEp1uvzZ0pCHkCdm9fycjnfOeMeIrOQ=="
+    },
     "node_modules/@primer/css": {
-      "version": "20.7.1",
-      "resolved": "https://registry.npmjs.org/@primer/css/-/css-20.7.1.tgz",
-      "integrity": "sha512-NcTKs6PZtT7btF8GlYvoRMq8XBJ8TWGA8VBPG+dAYHm/38gx8JwKSiZG0Dt2Ue1AYoV/75Slp/mUPDnFCmbOOQ==",
+      "version": "20.8.0",
+      "resolved": "https://registry.npmjs.org/@primer/css/-/css-20.8.0.tgz",
+      "integrity": "sha512-ybrROX5Qaurqidl4QlSC7AwZ1fTKODlQQDkncOXzHoFM0xe2aMH4zvGXz79Cz2W1sdJ4kpa8dsGqfkkcXbjalQ==",
       "dependencies": {
-        "@primer/primitives": "^7.9.0"
+        "@primer/primitives": "^7.9.0",
+        "@primer/view-components": "^0.0.115"
       },
       "engines": {
         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
@@ -1927,6 +1994,23 @@
       "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.9.0.tgz",
       "integrity": "sha512-ZHHfwB0z0z6nDJp263gyGIClYDy+rl0nwqyi4qhcv3Cxhkmtf+If2KVjr6FQqBBFfi1wQwUzaax2FBvfEMFBnw=="
     },
+    "node_modules/@primer/view-components": {
+      "version": "0.0.115",
+      "resolved": "https://registry.npmjs.org/@primer/view-components/-/view-components-0.0.115.tgz",
+      "integrity": "sha512-Qo6vNE0/UK6azsu9wTpb9AneHpM2FkA/saZ6UB1kvRttD5M0d/xto8sqq6b45QkKukqIlS4MhzyyvLIvC6rI1g==",
+      "dependencies": {
+        "@github/auto-check-element": "^5.2.0",
+        "@github/auto-complete-element": "^3.3.4",
+        "@github/catalyst": "^1.6.0",
+        "@github/clipboard-copy-element": "^1.1.2",
+        "@github/details-menu-element": "^1.0.12",
+        "@github/image-crop-element": "^5.0.0",
+        "@github/mini-throttle": "^2.1.0",
+        "@github/relative-time-element": "^4.0.0",
+        "@github/tab-container-element": "^3.1.2",
+        "@primer/behaviors": "^1.2.0"
+      }
+    },
     "node_modules/@sinclair/typebox": {
       "version": "0.24.51",
       "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
@@ -10947,6 +11031,69 @@
       "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz",
       "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw=="
     },
+    "@github/auto-check-element": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/@github/auto-check-element/-/auto-check-element-5.2.0.tgz",
+      "integrity": "sha512-YODZZUSeoZVJQ04p73MAohrEK37SJlVRDUTaFiPYse9K3z3bNEm+ekq5qYCIyDKGgX7hUhr3WZF35qHxr/zu0Q==",
+      "requires": {
+        "@github/mini-throttle": "^1.0.7"
+      },
+      "dependencies": {
+        "@github/mini-throttle": {
+          "version": "1.0.7",
+          "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-1.0.7.tgz",
+          "integrity": "sha512-1fzCDXpxI4J59pNmO0r0Y1g+R8Sa2B5ersce8AuFu5STMu7b++9osdedK0zWduYowBIgsPQZihJBN19WrAF64g=="
+        }
+      }
+    },
+    "@github/auto-complete-element": {
+      "version": "3.3.4",
+      "resolved": "https://registry.npmjs.org/@github/auto-complete-element/-/auto-complete-element-3.3.4.tgz",
+      "integrity": "sha512-b9SBCLIQGfCI3G0pGYE8rBSUDON5iFKUgHXgAtVdgZii0dnLFxNl5tn1R/RaBEFdzBQPDl9vqu41TF/Hs3w8FA==",
+      "requires": {
+        "@github/combobox-nav": "^2.0.2"
+      }
+    },
+    "@github/catalyst": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/@github/catalyst/-/catalyst-1.6.0.tgz",
+      "integrity": "sha512-u8A+DameixqpeyHzvnJWTGj+wfiskQOYHzSiJscCWVfMkIT3rxnbHMtGh3lMthaRY21nbUOK71WcsCnCrXhBJQ=="
+    },
+    "@github/clipboard-copy-element": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.1.2.tgz",
+      "integrity": "sha512-L6CMrcA5we0udafvoSuRCE/Ci/3xrLWKYRGup2IlhxF771bQYsQ2EB1of182pI8ZWM4oxgwzu37+igMeoZjN/A=="
+    },
+    "@github/combobox-nav": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.1.5.tgz",
+      "integrity": "sha512-dmG1PuppNKHnBBEcfylWDwj9SSxd/E/qd8mC1G/klQC3s7ps5q6JZ034mwkkG0LKfI+Y+UgEua/ROD776N400w=="
+    },
+    "@github/details-menu-element": {
+      "version": "1.0.13",
+      "resolved": "https://registry.npmjs.org/@github/details-menu-element/-/details-menu-element-1.0.13.tgz",
+      "integrity": "sha512-gMkii86w/oUP5dq8yOWZn1sgbgtFj3AYETxxtpsqRggZktgd8te4+npAn4Hm+936c/lxmEzXqfjARL/CzGR4+w=="
+    },
+    "@github/image-crop-element": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@github/image-crop-element/-/image-crop-element-5.0.0.tgz",
+      "integrity": "sha512-Vgm2OwWAs1ESoib/t5sjxsAYo6YTOxxAjWDRxswX7qrqoyCejTZ3hshdo4Ep5e+Mz/GVTZC3rdMtg06dk/eT4g=="
+    },
+    "@github/mini-throttle": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-2.1.0.tgz",
+      "integrity": "sha512-iEeR2OdVCPkdIPUszL8gJnKNu4MR8ANh7y0u/LPyaatYezgaWxUZEzhFntloqQq+HE6MZkFy+cl+xzCNuljOdw=="
+    },
+    "@github/relative-time-element": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.1.5.tgz",
+      "integrity": "sha512-WAf1EQV5Sn6jGuAIQur/ztKlEV9R+VHDNwqEbeaOb6s9fiwM5z7+ujlWNZtgFkDp3lF0H8D/f0vdiPlfHz0ZTQ=="
+    },
+    "@github/tab-container-element": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/@github/tab-container-element/-/tab-container-element-3.2.0.tgz",
+      "integrity": "sha512-to5ZJuywKK3KX53X1ifOcWjvUTQcBGdQ6Qkhm8L97xQ3ovICag1048M3YMpc+QSdr8xWeCBMnLeMnENqotB0Og=="
+    },
     "@googlemaps/google-maps-services-js": {
       "version": "3.3.16",
       "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.16.tgz",
@@ -11846,12 +11993,18 @@
         }
       }
     },
+    "@primer/behaviors": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.1.tgz",
+      "integrity": "sha512-aMRDUQ350lk0FxtL5gJWPFHHOSSzDbJ6uNJVIt8XSqiGe1pxuW5mVVfrEp1uvzZ0pCHkCdm9fycjnfOeMeIrOQ=="
+    },
     "@primer/css": {
-      "version": "20.7.1",
-      "resolved": "https://registry.npmjs.org/@primer/css/-/css-20.7.1.tgz",
-      "integrity": "sha512-NcTKs6PZtT7btF8GlYvoRMq8XBJ8TWGA8VBPG+dAYHm/38gx8JwKSiZG0Dt2Ue1AYoV/75Slp/mUPDnFCmbOOQ==",
+      "version": "20.8.0",
+      "resolved": "https://registry.npmjs.org/@primer/css/-/css-20.8.0.tgz",
+      "integrity": "sha512-ybrROX5Qaurqidl4QlSC7AwZ1fTKODlQQDkncOXzHoFM0xe2aMH4zvGXz79Cz2W1sdJ4kpa8dsGqfkkcXbjalQ==",
       "requires": {
-        "@primer/primitives": "^7.9.0"
+        "@primer/primitives": "^7.9.0",
+        "@primer/view-components": "^0.0.115"
       }
     },
     "@primer/octicons": {
@@ -11867,6 +12020,23 @@
       "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.9.0.tgz",
       "integrity": "sha512-ZHHfwB0z0z6nDJp263gyGIClYDy+rl0nwqyi4qhcv3Cxhkmtf+If2KVjr6FQqBBFfi1wQwUzaax2FBvfEMFBnw=="
     },
+    "@primer/view-components": {
+      "version": "0.0.115",
+      "resolved": "https://registry.npmjs.org/@primer/view-components/-/view-components-0.0.115.tgz",
+      "integrity": "sha512-Qo6vNE0/UK6azsu9wTpb9AneHpM2FkA/saZ6UB1kvRttD5M0d/xto8sqq6b45QkKukqIlS4MhzyyvLIvC6rI1g==",
+      "requires": {
+        "@github/auto-check-element": "^5.2.0",
+        "@github/auto-complete-element": "^3.3.4",
+        "@github/catalyst": "^1.6.0",
+        "@github/clipboard-copy-element": "^1.1.2",
+        "@github/details-menu-element": "^1.0.12",
+        "@github/image-crop-element": "^5.0.0",
+        "@github/mini-throttle": "^2.1.0",
+        "@github/relative-time-element": "^4.0.0",
+        "@github/tab-container-element": "^3.1.2",
+        "@primer/behaviors": "^1.2.0"
+      }
+    },
     "@sinclair/typebox": {
       "version": "0.24.51",
       "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
diff --git a/package.json b/package.json
index f19df9f4078..e7638b44b22 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
     "@faker-js/faker": "^7.6.0",
     "@octokit/graphql": "^5.0.4",
     "@octokit/rest": "^19.0.5",
-    "@primer/css": "^20.7.1",
+    "@primer/css": "^20.8.0",
     "@primer/octicons": "^17.10.0",
     "axios": "^1.1.3",
     "clipboard": "^2.0.11",

From 3b30d7826ff0cee39e1d402d624ea947b87570a4 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 19 Dec 2022 12:45:24 -0500
Subject: [PATCH 031/196] chore(deps): bump eslint from 8.29.0 to 8.30.0
 (#1325) [skip ci]

---
 package-lock.json | 78 +++++++++++++++++++++++------------------------
 package.json      |  2 +-
 2 files changed, 40 insertions(+), 40 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index cf60a0afc6a..76e72313355 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,7 +50,7 @@
         "xml-formatter": "^2.6.1"
       },
       "devDependencies": {
-        "eslint": "^8.29.0",
+        "eslint": "^8.30.0",
         "jest": "^29.3.1",
         "libxmljs2": "^0.31.0"
       },
@@ -742,15 +742,15 @@
       "dev": true
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
-      "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz",
+      "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
         "espree": "^9.4.0",
-        "globals": "^13.15.0",
+        "globals": "^13.19.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
         "js-yaml": "^4.1.0",
@@ -912,9 +912,9 @@
       }
     },
     "node_modules/@humanwhocodes/config-array": {
-      "version": "0.11.7",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz",
-      "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==",
+      "version": "0.11.8",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+      "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
       "dev": true,
       "dependencies": {
         "@humanwhocodes/object-schema": "^1.2.1",
@@ -4976,13 +4976,13 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.29.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz",
-      "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==",
+      "version": "8.30.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz",
+      "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==",
       "dev": true,
       "dependencies": {
-        "@eslint/eslintrc": "^1.3.3",
-        "@humanwhocodes/config-array": "^0.11.6",
+        "@eslint/eslintrc": "^1.4.0",
+        "@humanwhocodes/config-array": "^0.11.8",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
         "ajv": "^6.10.0",
@@ -5001,7 +5001,7 @@
         "file-entry-cache": "^6.0.1",
         "find-up": "^5.0.0",
         "glob-parent": "^6.0.2",
-        "globals": "^13.15.0",
+        "globals": "^13.19.0",
         "grapheme-splitter": "^1.0.4",
         "ignore": "^5.2.0",
         "import-fresh": "^3.0.0",
@@ -5184,9 +5184,9 @@
       }
     },
     "node_modules/espree": {
-      "version": "9.4.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
-      "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
+      "version": "9.4.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+      "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
       "dev": true,
       "dependencies": {
         "acorn": "^8.8.0",
@@ -5910,9 +5910,9 @@
       }
     },
     "node_modules/globals": {
-      "version": "13.17.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
-      "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
+      "version": "13.19.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
+      "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
       "dev": true,
       "dependencies": {
         "type-fest": "^0.20.2"
@@ -10974,15 +10974,15 @@
       "dev": true
     },
     "@eslint/eslintrc": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz",
-      "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz",
+      "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==",
       "dev": true,
       "requires": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
         "espree": "^9.4.0",
-        "globals": "^13.15.0",
+        "globals": "^13.19.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
         "js-yaml": "^4.1.0",
@@ -11129,9 +11129,9 @@
       }
     },
     "@humanwhocodes/config-array": {
-      "version": "0.11.7",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz",
-      "integrity": "sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==",
+      "version": "0.11.8",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+      "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
       "dev": true,
       "requires": {
         "@humanwhocodes/object-schema": "^1.2.1",
@@ -14346,13 +14346,13 @@
       }
     },
     "eslint": {
-      "version": "8.29.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.29.0.tgz",
-      "integrity": "sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==",
+      "version": "8.30.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz",
+      "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==",
       "dev": true,
       "requires": {
-        "@eslint/eslintrc": "^1.3.3",
-        "@humanwhocodes/config-array": "^0.11.6",
+        "@eslint/eslintrc": "^1.4.0",
+        "@humanwhocodes/config-array": "^0.11.8",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
         "ajv": "^6.10.0",
@@ -14371,7 +14371,7 @@
         "file-entry-cache": "^6.0.1",
         "find-up": "^5.0.0",
         "glob-parent": "^6.0.2",
-        "globals": "^13.15.0",
+        "globals": "^13.19.0",
         "grapheme-splitter": "^1.0.4",
         "ignore": "^5.2.0",
         "import-fresh": "^3.0.0",
@@ -14499,9 +14499,9 @@
       "dev": true
     },
     "espree": {
-      "version": "9.4.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz",
-      "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==",
+      "version": "9.4.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+      "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
       "dev": true,
       "requires": {
         "acorn": "^8.8.0",
@@ -15027,9 +15027,9 @@
       }
     },
     "globals": {
-      "version": "13.17.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz",
-      "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==",
+      "version": "13.19.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
+      "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
       "dev": true,
       "requires": {
         "type-fest": "^0.20.2"
diff --git a/package.json b/package.json
index e7638b44b22..21bfed3307b 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,7 @@
     "xml-formatter": "^2.6.1"
   },
   "devDependencies": {
-    "eslint": "^8.29.0",
+    "eslint": "^8.30.0",
     "jest": "^29.3.1",
     "libxmljs2": "^0.31.0"
   },

From 490a9691dcfc57900ab34acf7cbd995f981024e4 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 19 Dec 2022 12:48:19 -0500
Subject: [PATCH 032/196] feat(plugins/community/screenshot): add
 `plugin_screenshot_mode` (#1324)

---
 source/plugins/community/screenshot/index.mjs | 36 +++++++++++++------
 .../plugins/community/screenshot/metadata.yml | 15 +++++++-
 .../templates/classic/partials/screenshot.ejs |  6 +++-
 source/templates/classic/style.css            |  3 ++
 4 files changed, 48 insertions(+), 12 deletions(-)

diff --git a/source/plugins/community/screenshot/index.mjs b/source/plugins/community/screenshot/index.mjs
index a4f20f02b2e..cd6a3b1e8b2 100644
--- a/source/plugins/community/screenshot/index.mjs
+++ b/source/plugins/community/screenshot/index.mjs
@@ -7,7 +7,7 @@ export default async function({login, q, imports, data, account}, {enabled = fal
       return null
 
     //Load inputs
-    let {url, selector, title, background, viewport, wait} = imports.metadata.plugins.screenshot.inputs({data, account, q})
+    let {url, selector, title, background, viewport, wait, mode} = imports.metadata.plugins.screenshot.inputs({data, account, q})
     if (!url)
       throw {error: {message: "URL is not set"}}
 
@@ -23,19 +23,35 @@ export default async function({login, q, imports, data, account}, {enabled = fal
       await new Promise(solve => setTimeout(solve, wait))
 
     //Screenshot
+    let content = null
+    let image = null
+    const metadata = {height:null, width:null}
     await page.waitForSelector(selector)
-    const clip = await page.evaluate(selector => {
-      const {x, y, width, height} = document.querySelector(selector).getBoundingClientRect()
-      return {x, y, width, height}
-    }, selector)
-    console.debug(`metrics/compute/${login}/plugins > screenshot > coordinates ${JSON.stringify(clip)}`)
-    const [buffer] = await imports.record({page, ...clip, frames: 1, background})
-    const screenshot = await imports.sharp(Buffer.from(buffer.split(",").pop(), "base64")).resize({width: Math.min(454 * (1 + data.large), clip.width)})
-    const metadata = await screenshot.metadata()
+    switch (mode) {
+      case "image":{
+        const clip = await page.evaluate(selector => {
+          const {x, y, width, height} = document.querySelector(selector).getBoundingClientRect()
+          return {x, y, width, height}
+        }, selector)
+        console.debug(`metrics/compute/${login}/plugins > screenshot > coordinates ${JSON.stringify(clip)}`)
+        const [buffer] = await imports.record({page, ...clip, frames: 1, background})
+        const screenshot = await imports.sharp(Buffer.from(buffer.split(",").pop(), "base64")).resize({width: Math.min(454 * (1 + data.large), clip.width)})
+        image = `data:image/png;base64,${(await screenshot.toBuffer()).toString("base64")}`
+        Object.assign(metadata, await screenshot.metadata())
+        break
+      }
+      case "text":{
+        content = await page.evaluate(selector => document.querySelector(selector)?.innerText ?? "", selector)
+        break
+      }
+      default:
+        throw {error: {message: `Unsupported mode "${mode}"`}}
+    }
+
     await browser.close()
 
     //Results
-    return {image: `data:image/png;base64,${(await screenshot.toBuffer()).toString("base64")}`, title, height: metadata.height, width: metadata.width, url}
+    return {mode, image, content, title, height: metadata.height, width: metadata.width, url}
   }
   //Handle errors
   catch (error) {
diff --git a/source/plugins/community/screenshot/metadata.yml b/source/plugins/community/screenshot/metadata.yml
index b478502e578..34c9d080c43 100644
--- a/source/plugins/community/screenshot/metadata.yml
+++ b/source/plugins/community/screenshot/metadata.yml
@@ -42,6 +42,19 @@ inputs:
     type: string
     default: body
 
+  plugin_screenshot_mode:
+    description: |
+      Output mode
+
+      - `image`: screenshot of selected element
+      - `text`: keep [`innerText`](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText) of selected element
+        - *⚠️ Any CSS style applied to text such as font size, weight or color will be removed*
+    type: string
+    default: image
+    values:
+      - image
+      - text
+
   plugin_screenshot_viewport:
     description: |
       Viewport options
@@ -63,4 +76,4 @@ inputs:
     description: |
       Background
     type: boolean
-    default: yes
\ No newline at end of file
+    default: yes
diff --git a/source/templates/classic/partials/screenshot.ejs b/source/templates/classic/partials/screenshot.ejs
index 4b3b31bb67b..0c498f16e1d 100644
--- a/source/templates/classic/partials/screenshot.ejs
+++ b/source/templates/classic/partials/screenshot.ejs
@@ -11,8 +11,12 @@
             <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M2.343 13.657A8 8 0 1113.657 2.343 8 8 0 012.343 13.657zM6.03 4.97a.75.75 0 00-1.06 1.06L6.94 8 4.97 9.97a.75.75 0 101.06 1.06L8 9.06l1.97 1.97a.75.75 0 101.06-1.06L9.06 8l1.97-1.97a.75.75 0 10-1.06-1.06L8 6.94 6.03 4.97z"></path></svg>
             <%= plugins.screenshot.error.message %>
           </div>
-        <% } else { %>
+        <% } else if (plugins.screenshot.image) { %>
           <img class="screenshot autosize" src="<%= plugins.screenshot.image %>" height="<%= plugins.screenshot.height %>" width="<%= plugins.screenshot.width %>" alt=""/>
+        <% } else if (plugins.screenshot.content) { %>
+          <div class="screenshot-content">
+            <%= plugins.screenshot.content %>
+          </div>
         <% } %>
       </section>
     </div>
diff --git a/source/templates/classic/style.css b/source/templates/classic/style.css
index 00e5b7b90da..6e562ccd88f 100644
--- a/source/templates/classic/style.css
+++ b/source/templates/classic/style.css
@@ -469,6 +469,9 @@
     margin: 8px 14px 4px;
     border-radius: 5px;
   }
+  .screenshot-content {
+    margin-left: 12px;
+  }
 
   svg.large .audits {
     display: inline-flex;

From 71c4c8c35bdf85fb27ea1c705afa76520054045a Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 19 Dec 2022 18:27:23 +0000
Subject: [PATCH 033/196] chore: code formatting

---
 source/plugins/community/screenshot/index.mjs | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/source/plugins/community/screenshot/index.mjs b/source/plugins/community/screenshot/index.mjs
index cd6a3b1e8b2..2c4d5521678 100644
--- a/source/plugins/community/screenshot/index.mjs
+++ b/source/plugins/community/screenshot/index.mjs
@@ -25,10 +25,10 @@ export default async function({login, q, imports, data, account}, {enabled = fal
     //Screenshot
     let content = null
     let image = null
-    const metadata = {height:null, width:null}
+    const metadata = {height: null, width: null}
     await page.waitForSelector(selector)
     switch (mode) {
-      case "image":{
+      case "image": {
         const clip = await page.evaluate(selector => {
           const {x, y, width, height} = document.querySelector(selector).getBoundingClientRect()
           return {x, y, width, height}
@@ -40,7 +40,7 @@ export default async function({login, q, imports, data, account}, {enabled = fal
         Object.assign(metadata, await screenshot.metadata())
         break
       }
-      case "text":{
+      case "text": {
         content = await page.evaluate(selector => document.querySelector(selector)?.innerText ?? "", selector)
         break
       }

From f38005cdeb71fdad86b83cacbe69f0e204e7d987 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 19 Dec 2022 18:28:22 +0000
Subject: [PATCH 034/196] ci: auto-regenerate files

---
 README.md                                     |  2 +-
 action.yml                                    |  4 ++++
 source/plugins/community/screenshot/README.md | 19 +++++++++++++++++++
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index f9eeebea2c0..433a8277150 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
   </tr>
   <tr>
     <th colspan="2" align="center">
-      <h3><a href="/README.md#-plugins">🧩 Customizable with 43 plugins and 310 options!</a></h3>
+      <h3><a href="/README.md#-plugins">🧩 Customizable with 43 plugins and 311 options!</a></h3>
     </th>
   </tr>
   <tr>
diff --git a/action.yml b/action.yml
index 98ee9d2857a..a1dd590bc0e 100644
--- a/action.yml
+++ b/action.yml
@@ -1310,6 +1310,10 @@ inputs:
     description: CSS Selector
     default: <default-value>
 
+  plugin_screenshot_mode:
+    description: Output mode
+    default: <default-value>
+
   plugin_screenshot_viewport:
     description: Viewport options
     default: <default-value>
diff --git a/source/plugins/community/screenshot/README.md b/source/plugins/community/screenshot/README.md
index f0f56a967a7..2fc47d120d5 100644
--- a/source/plugins/community/screenshot/README.md
+++ b/source/plugins/community/screenshot/README.md
@@ -74,6 +74,25 @@
     <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> body<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_screenshot_mode</code></h4></td>
+    <td rowspan="2"><p>Output mode</p>
+<ul>
+<li><code>image</code>: screenshot of selected element</li>
+<li><code>text</code>: keep <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/innerText"><code>innerText</code></a> of selected element<ul>
+<li><em>⚠️ Any CSS style applied to text such as font size, weight or color will be removed</em></li>
+</ul>
+</li>
+</ul>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
+<br>
+<b>default:</b> image<br>
+<b>allowed values:</b><ul><li>image</li><li>text</li></ul></td>
   </tr>
   <tr>
     <td nowrap="nowrap"><h4><code>plugin_screenshot_viewport</code></h4></td>

From d2ac7b6266a02498d9fbfdb527ee1b172e9d1860 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 19 Dec 2022 18:08:53 -0500
Subject: [PATCH 035/196] fix(app/metrics): SVGs broken on markdown templates
 (#1315)

---
 source/app/action/index.mjs | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/source/app/action/index.mjs b/source/app/action/index.mjs
index e7d996215cf..10df0b73ec9 100644
--- a/source/app/action/index.mjs
+++ b/source/app/action/index.mjs
@@ -523,6 +523,8 @@ function quit(reason) {
           }, {retries: retries_output_action, delay: retries_delay_output_action})
         }
         buffer.content = rendered
+        await fs.writeFile(paths.join("/renders", filename), buffer.content)
+        info(`Update /metrics_renders/${filename}`, "ok")
       }
 
       //Check changes

From d14f49fce2cf7525b196af0acff5f42b5ca9d7bf Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 19 Dec 2022 19:46:08 -0500
Subject: [PATCH 036/196] feat(app/metrics): warn about missing extras features
 permissions (closes #1177)

---
 source/app/web/statics/insights/index.html | 6 ++++++
 source/app/web/statics/insights/script.js  | 3 +++
 2 files changed, 9 insertions(+)

diff --git a/source/app/web/statics/insights/index.html b/source/app/web/statics/insights/index.html
index 97787a61fa6..5770b85ed64 100644
--- a/source/app/web/statics/insights/index.html
+++ b/source/app/web/statics/insights/index.html
@@ -85,6 +85,12 @@ <h2>
 
         <template v-if="metrics">
 
+          <section class="container">
+            <div class="warning" v-if="warnings.length">
+              <div v-for="warning in warnings">⚠️ {{ warning.message }}</div>
+            </div>
+          </section>
+
           <section class="container">
             <a :href="`https://github.com/${user}`" class="user">
               <img :src="account.avatar">
diff --git a/source/app/web/statics/insights/script.js b/source/app/web/statics/insights/script.js
index cfd1775a353..b909352a4e8 100644
--- a/source/app/web/statics/insights/script.js
+++ b/source/app/web/statics/insights/script.js
@@ -169,6 +169,9 @@
       params() {
         return new URLSearchParams({from: location.href})
       },
+      warnings() {
+        return Object.entries(this.metrics?.rendered.plugins ?? {}).map(([_, value]) => value?.error).filter(value => value)
+      },
       stats() {
         return this.metrics?.rendered.user ?? null
       },

From da06ddb23592b7f1a7c8958a2a19a656574ce096 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 21 Dec 2022 19:06:18 -0500
Subject: [PATCH 037/196] chore: prepare release v3.31 (#1328) [skip ci]

---
 package-lock.json | 4 ++--
 package.json      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 76e72313355..21df1e6896c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "metrics",
-  "version": "3.31.0-beta",
+  "version": "3.31.0",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "metrics",
-      "version": "3.31.0-beta",
+      "version": "3.31.0",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index 21bfed3307b..f21b56998b9 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "metrics",
-  "version": "3.31.0-beta",
+  "version": "3.31.0",
   "description": "An infographics generator with 40+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!",
   "main": "index.mjs",
   "scripts": {

From a18c9eab2dcdc0b5c2f446dd06a2d3789d019287 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 21 Dec 2022 19:08:14 -0500
Subject: [PATCH 038/196] ci: auto-regenerate files

---
 README.md | 2 --
 1 file changed, 2 deletions(-)

diff --git a/README.md b/README.md
index 433a8277150..52dce52338a 100644
--- a/README.md
+++ b/README.md
@@ -429,8 +429,6 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
 # 📚 Documentation
 
 
-> <sup>*⚠️ This is the documentation of **v3.31-beta** (`@master`/`@main` branches) which includes [unreleased features](https://github.com/lowlighter/metrics/compare/latest...master) planned for next release. See documentation for current released version [**v3.30** (`@latest` branch) here](https://github.com/lowlighter/metrics/blob/latest/README.md).* </sup>
-
 
 
 ## 🦮 Setup

From c1240845bc6547ad60bfcf8d26838c82be83d573 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 21 Dec 2022 19:08:39 -0500
Subject: [PATCH 039/196] Release v3.31 [release]


From 520ff377142700a2e98fb3ee39798b6b8c43fe98 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 22 Dec 2022 00:06:37 -0500
Subject: [PATCH 040/196] chore: create version 3.32-beta [skip ci]

---
 package-lock.json                          | 4 ++--
 package.json                               | 2 +-
 source/app/web/statics/embed/index.html    | 8 ++++----
 source/app/web/statics/index.html          | 6 +++---
 source/app/web/statics/insights/index.html | 8 ++++----
 source/app/web/statics/oauth/index.html    | 8 ++++----
 6 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 21df1e6896c..2d9cfd7a5d8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "metrics",
-  "version": "3.31.0",
+  "version": "3.32.0-beta",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "metrics",
-      "version": "3.31.0",
+      "version": "3.32.0-beta",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index f21b56998b9..a269a7a5012 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "metrics",
-  "version": "3.31.0",
+  "version": "3.32.0-beta",
   "description": "An infographics generator with 40+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!",
   "main": "index.mjs",
   "scripts": {
diff --git a/source/app/web/statics/embed/index.html b/source/app/web/statics/embed/index.html
index 6c84130eb27..6d05e80b446 100644
--- a/source/app/web/statics/embed/index.html
+++ b/source/app/web/statics/embed/index.html
@@ -8,8 +8,8 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.30">
-    <link rel="stylesheet" href="/.css/style.css?v=3.30">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.32">
+    <link rel="stylesheet" href="/.css/style.css?v=3.32">
     <link rel="stylesheet" href="/.css/style.prism.css" />
   </head>
   <body>
@@ -230,7 +230,7 @@
     <script src="/.js/vue.min.js"></script>
     <script src="/.js/vue.prism.min.js"></script>
     <script src="/.js/clipboard.min.js"></script>
-    <script src="/.js/embed/app.placeholder.js?v=3.30"></script>
-    <script src="/.js/embed/app.js?v=3.30"></script>
+    <script src="/.js/embed/app.placeholder.js?v=3.32"></script>
+    <script src="/.js/embed/app.js?v=3.32"></script>
   </body>
 </html>
\ No newline at end of file
diff --git a/source/app/web/statics/index.html b/source/app/web/statics/index.html
index 9157a3f164a..44a7349620a 100644
--- a/source/app/web/statics/index.html
+++ b/source/app/web/statics/index.html
@@ -8,8 +8,8 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.30">
-    <link rel="stylesheet" href="/.css/style.css?v=3.30">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.32">
+    <link rel="stylesheet" href="/.css/style.css?v=3.32">
   </head>
   <body>
     <!-- Vue app -->
@@ -100,6 +100,6 @@ <h2>
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/.js/app.js?v=3.30"></script>
+    <script src="/.js/app.js?v=3.32"></script>
   </body>
 </html>
\ No newline at end of file
diff --git a/source/app/web/statics/insights/index.html b/source/app/web/statics/insights/index.html
index 5770b85ed64..69f503d6937 100644
--- a/source/app/web/statics/insights/index.html
+++ b/source/app/web/statics/insights/index.html
@@ -8,9 +8,9 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.30">
-    <link rel="stylesheet" href="/.css/style.css?v=3.30">
-    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.30">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.32">
+    <link rel="stylesheet" href="/.css/style.css?v=3.32">
+    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.32">
   </head>
   <body>
     <!-- Vue app -->
@@ -601,6 +601,6 @@ <h2>
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/insights/.statics/script.js?v=3.30"></script>
+    <script src="/insights/.statics/script.js?v=3.32"></script>
   </body>
 </html>
diff --git a/source/app/web/statics/oauth/index.html b/source/app/web/statics/oauth/index.html
index e3b12b1e2e2..7c1fb1a5e47 100644
--- a/source/app/web/statics/oauth/index.html
+++ b/source/app/web/statics/oauth/index.html
@@ -8,9 +8,9 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.30">
-    <link rel="stylesheet" href="/.css/style.css?v=3.30">
-    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.30">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.32">
+    <link rel="stylesheet" href="/.css/style.css?v=3.32">
+    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.32">
   </head>
   <body>
     <!-- Vue app -->
@@ -105,6 +105,6 @@
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/.oauth/script.js?v=3.30"></script>
+    <script src="/.oauth/script.js?v=3.32"></script>
   </body>
 </html>

From 8346176b4896dc465478fe74c7496bfae11c6966 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 8 Jan 2023 12:18:57 -0500
Subject: [PATCH 041/196] fix(ci): prevent dependencies to be closed by stale
 [skip ci]

---
 .github/workflows/stale.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 908385b6cd1..76778ac2422 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -18,6 +18,7 @@ jobs:
           days-before-pr-close: 3
           stale-pr-label: ⏹️ stale
           remove-stale-when-updated: yes
+          exempt-issue-labels: 📦 dependencies
   lock:
     name: Lock inactive closed issues and pull requests
     needs:

From f0c1c4c4e53383eb0bdb170a0bf0cd1f6279372e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 8 Jan 2023 12:19:25 -0500
Subject: [PATCH 042/196] chore(deps): bump json5 from 2.2.1 to 2.2.3 (#1338)
 [skip ci]

---
 package-lock.json | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 2d9cfd7a5d8..d43cb9958b4 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7288,9 +7288,9 @@
       "optional": true
     },
     "node_modules/json5": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
-      "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
       "dev": true,
       "bin": {
         "json5": "lib/cli.js"
@@ -16077,9 +16077,9 @@
       "optional": true
     },
     "json5": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
-      "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
       "dev": true
     },
     "jsprim": {

From 861e74d015222f70c7c9342dc2267aca4712d14b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 8 Jan 2023 12:19:35 -0500
Subject: [PATCH 043/196] chore(deps): bump eslint from 8.30.0 to 8.31.0
 (#1337) [skip ci]

---
 package-lock.json | 30 +++++++++++++++---------------
 package.json      |  2 +-
 2 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d43cb9958b4..b96b24ebb19 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,7 +50,7 @@
         "xml-formatter": "^2.6.1"
       },
       "devDependencies": {
-        "eslint": "^8.30.0",
+        "eslint": "^8.31.0",
         "jest": "^29.3.1",
         "libxmljs2": "^0.31.0"
       },
@@ -742,9 +742,9 @@
       "dev": true
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz",
-      "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+      "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
@@ -4976,12 +4976,12 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.30.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz",
-      "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==",
+      "version": "8.31.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz",
+      "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==",
       "dev": true,
       "dependencies": {
-        "@eslint/eslintrc": "^1.4.0",
+        "@eslint/eslintrc": "^1.4.1",
         "@humanwhocodes/config-array": "^0.11.8",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
@@ -10974,9 +10974,9 @@
       "dev": true
     },
     "@eslint/eslintrc": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz",
-      "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==",
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
+      "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
       "dev": true,
       "requires": {
         "ajv": "^6.12.4",
@@ -14346,12 +14346,12 @@
       }
     },
     "eslint": {
-      "version": "8.30.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz",
-      "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==",
+      "version": "8.31.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz",
+      "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==",
       "dev": true,
       "requires": {
-        "@eslint/eslintrc": "^1.4.0",
+        "@eslint/eslintrc": "^1.4.1",
         "@humanwhocodes/config-array": "^0.11.8",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
diff --git a/package.json b/package.json
index a269a7a5012..ac368b13cb3 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,7 @@
     "xml-formatter": "^2.6.1"
   },
   "devDependencies": {
-    "eslint": "^8.30.0",
+    "eslint": "^8.31.0",
     "jest": "^29.3.1",
     "libxmljs2": "^0.31.0"
   },

From 30f7ab31bee32e23577e3652e58d3a6b98f957ab Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 8 Jan 2023 12:20:05 -0500
Subject: [PATCH 044/196] chore(deps): bump xml-formatter from 2.6.1 to 3.2.0
 (#1326) [skip ci]

---
 package-lock.json | 34 +++++++++++++++++-----------------
 package.json      |  2 +-
 2 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b96b24ebb19..42f465d193a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -47,7 +47,7 @@
         "twemoji-parser": "^14.0.0",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
-        "xml-formatter": "^2.6.1"
+        "xml-formatter": "^3.2.0"
       },
       "devDependencies": {
         "eslint": "^8.31.0",
@@ -10339,14 +10339,14 @@
       "optional": true
     },
     "node_modules/xml-formatter": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.6.1.tgz",
-      "integrity": "sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-3.2.0.tgz",
+      "integrity": "sha512-PYROODIUDHz1SDFePg2VThajPOuSmvo/PrYRKARcSc9xxKKs62EN9uar60IIxxknzmOSNDAxlylpw34bQp0g/Q==",
       "dependencies": {
-        "xml-parser-xo": "^3.2.0"
+        "xml-parser-xo": "^4.0.1"
       },
       "engines": {
-        "node": ">= 10"
+        "node": ">= 14"
       }
     },
     "node_modules/xml-name-validator": {
@@ -10356,11 +10356,11 @@
       "optional": true
     },
     "node_modules/xml-parser-xo": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz",
-      "integrity": "sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg==",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-4.0.1.tgz",
+      "integrity": "sha512-wJmRjzVZr7D+kYSajd3zqT7tt+y9L2vVWp+s7ARxzPMtk/gZcTY0KB14B801QX2D2wqIQ1d3bV/LgcnwlpKyyg==",
       "engines": {
-        "node": ">= 10"
+        "node": ">= 14"
       }
     },
     "node_modules/xml2js": {
@@ -18377,11 +18377,11 @@
       "optional": true
     },
     "xml-formatter": {
-      "version": "2.6.1",
-      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-2.6.1.tgz",
-      "integrity": "sha512-dOiGwoqm8y22QdTNI7A+N03tyVfBlQ0/oehAzxIZtwnFAHGeSlrfjF73YQvzSsa/Kt6+YZasKsrdu6OIpuBggw==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-3.2.0.tgz",
+      "integrity": "sha512-PYROODIUDHz1SDFePg2VThajPOuSmvo/PrYRKARcSc9xxKKs62EN9uar60IIxxknzmOSNDAxlylpw34bQp0g/Q==",
       "requires": {
-        "xml-parser-xo": "^3.2.0"
+        "xml-parser-xo": "^4.0.1"
       }
     },
     "xml-name-validator": {
@@ -18391,9 +18391,9 @@
       "optional": true
     },
     "xml-parser-xo": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-3.2.0.tgz",
-      "integrity": "sha512-8LRU6cq+d7mVsoDaMhnkkt3CTtAs4153p49fRo+HIB3I1FD1o5CeXRjRH29sQevIfVJIcPjKSsPU/+Ujhq09Rg=="
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-4.0.1.tgz",
+      "integrity": "sha512-wJmRjzVZr7D+kYSajd3zqT7tt+y9L2vVWp+s7ARxzPMtk/gZcTY0KB14B801QX2D2wqIQ1d3bV/LgcnwlpKyyg=="
     },
     "xml2js": {
       "version": "0.4.23",
diff --git a/package.json b/package.json
index ac368b13cb3..3c142c6cd02 100644
--- a/package.json
+++ b/package.json
@@ -66,7 +66,7 @@
     "twemoji-parser": "^14.0.0",
     "vue": "^2.7.1",
     "vue-prism-component": "^1.2.0",
-    "xml-formatter": "^2.6.1"
+    "xml-formatter": "^3.2.0"
   },
   "devDependencies": {
     "eslint": "^8.31.0",

From fd2e77485b78f44ab0e2186748c431849a7077e3 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 8 Jan 2023 12:25:18 -0500
Subject: [PATCH 045/196] chore(deps): update dependencies [skip ci]

---
 package-lock.json | 197 ++++++++++++++++++++++++----------------------
 package.json      |  18 ++---
 2 files changed, 110 insertions(+), 105 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 42f465d193a..e859df560ff 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,41 +13,48 @@
         "@actions/core": "^1.10.0",
         "@actions/github": "^5.1.1",
         "@faker-js/faker": "^7.6.0",
+        "@googlemaps/google-maps-services-js": "^3.3.26",
         "@octokit/graphql": "^5.0.4",
         "@octokit/rest": "^19.0.5",
         "@primer/css": "^20.8.0",
-        "@primer/octicons": "^17.10.0",
+        "@primer/octicons": "^17.10.1",
         "axios": "^1.1.3",
+        "chess.js": "^1.0.0-alpha.0",
         "clipboard": "^2.0.11",
+        "color": "^4.2.3",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
-        "d3": "^7.7.0",
+        "d3": "^7.8.0",
         "d3-node": "^3.0.0",
         "ejs": "^3.1.8",
         "emoji-name-map": "^1.2.9",
         "express": "^4.18.2",
         "express-rate-limit": "^6.7.0",
         "file-type": "^18.0.0",
+        "gifencoder": "^2.0.1",
         "js-yaml": "^4.1.0",
         "linguist-js": "^2.5.3",
-        "marked": "^4.2.4",
+        "marked": "^4.2.5",
         "memory-cache": "^0.2.0",
-        "minimatch": "^5.1.1",
+        "minimatch": "^5.1.2",
+        "node-chartist": "^1.0.5",
         "node-fetch": "^3.3.0",
-        "open-graph-scraper": "^5.0.1",
+        "open-graph-scraper": "^5.0.3",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^19.4.0",
+        "puppeteer": "^19.4.1",
         "purgecss": "^5.0.0",
+        "rss": "^1.2.2",
         "rss-parser": "^3.12.0",
-        "sanitize-html": "^2.8.0",
-        "sharp": "^0.31.2",
+        "sanitize-html": "^2.8.1",
+        "sharp": "^0.31.3",
         "simple-git": "^3.15.1",
         "svgo": "^3.0.2",
         "twemoji-parser": "^14.0.0",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
-        "xml-formatter": "^3.2.0"
+        "xml-formatter": "^3.2.0",
+        "yargs-parser": "^21.1.1"
       },
       "devDependencies": {
         "eslint": "^8.31.0",
@@ -55,7 +62,7 @@
         "libxmljs2": "^0.31.0"
       },
       "optionalDependencies": {
-        "@googlemaps/google-maps-services-js": "^3.3.16",
+        "@googlemaps/google-maps-services-js": "^3.3.26",
         "chess.js": "^1.0.0-alpha.0",
         "color": "^4.2.3",
         "gifencoder": "^2.0.1",
@@ -880,16 +887,16 @@
       "integrity": "sha512-to5ZJuywKK3KX53X1ifOcWjvUTQcBGdQ6Qkhm8L97xQ3ovICag1048M3YMpc+QSdr8xWeCBMnLeMnENqotB0Og=="
     },
     "node_modules/@googlemaps/google-maps-services-js": {
-      "version": "3.3.16",
-      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.16.tgz",
-      "integrity": "sha512-0YxWVR5tRCK4kgQNP48+K8yVMZt9Nvel49Ra37q25oopdUkxtLyO39DYCLFrqyk1K1ne+RmuNDKavPyQKpWMSw==",
+      "version": "3.3.26",
+      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.26.tgz",
+      "integrity": "sha512-/t0J/vLxPJcFsygSJU50WHgz2R3noAr7SkicthukD1HaEpMQ/O+llYt80R5yoO5cV9vMMDSqGUO7TvIEqiy3Ig==",
       "optional": true,
       "dependencies": {
         "@googlemaps/url-signature": "^1.0.4",
         "agentkeepalive": "^4.1.0",
-        "axios": "^0.27.0",
-        "query-string": "^7.0.1",
-        "retry-axios": "^2.2.1"
+        "axios": "0.27.2",
+        "query-string": "7.1.3",
+        "retry-axios": "2.6.0"
       }
     },
     "node_modules/@googlemaps/google-maps-services-js/node_modules/axios": {
@@ -1982,9 +1989,9 @@
       }
     },
     "node_modules/@primer/octicons": {
-      "version": "17.10.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.0.tgz",
-      "integrity": "sha512-rg+NfA4M/SFutVzsqGwGWoKgXpHpTAbnoGvyGbkswT7iLV0PBFGJRkV61MhC61wEEF4SErMiaH5tOQKlvgvV9A==",
+      "version": "17.10.1",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.1.tgz",
+      "integrity": "sha512-fyq/lItQp18Ibi7c2oXVVw7H5K2a8qb8D2dnkTLf2+yUPjc3Fc+SEGS9x6iU6sQAEpr4LctcFl9ZSZ732EM63A==",
       "dependencies": {
         "object-assign": "^4.1.1"
       }
@@ -3506,9 +3513,9 @@
       "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
     },
     "node_modules/d3": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.7.0.tgz",
-      "integrity": "sha512-VEwHCMgMjD2WBsxeRGUE18RmzxT9Bn7ghDpzvTEvkLSBAKgTMydJjouZTjspgQfRHpPt/PB3EHWBa6SSyFQq4g==",
+      "version": "7.8.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.0.tgz",
+      "integrity": "sha512-a5rNemRadWkEfqnY5NsD4RdCP9vn8EIJ4I5Rl14U0uKH1SXqcNmk/h9aGaAF1O98lz6L9M0IeUcuPa9GUYbI5A==",
       "dependencies": {
         "d3-array": "3",
         "d3-axis": "3",
@@ -7499,9 +7506,9 @@
       }
     },
     "node_modules/marked": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.4.tgz",
-      "integrity": "sha512-Wcc9ikX7Q5E4BYDPvh1C6QNSxrjC9tBgz+A/vAhp59KXUgachw++uMvMKiSW8oA85nopmPZcEvBoex/YLMsiyA==",
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.5.tgz",
+      "integrity": "sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ==",
       "bin": {
         "marked": "bin/marked.js"
       },
@@ -7637,9 +7644,9 @@
       }
     },
     "node_modules/minimatch": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz",
-      "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==",
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
+      "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -7972,9 +7979,9 @@
       }
     },
     "node_modules/open-graph-scraper": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-5.0.1.tgz",
-      "integrity": "sha512-pxWxReziLjYBVEt6oy4bLpVGqKApPFV3BHD7YDE2TaGRB84NdRU8J0V7ihsCOkFxKKgiVH2M5jx0c59hDaehHQ==",
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-5.0.3.tgz",
+      "integrity": "sha512-TwDOwvQlm6h14chfjyzBXCHhW99SIU399cRQBcx0mxzl1fvIjDTlWVwAN2q7+A8YTfuvXoV2fwAYI+HmVVw5pg==",
       "dependencies": {
         "chardet": "^1.5.0",
         "cheerio": "^1.0.0-rc.12",
@@ -8462,26 +8469,25 @@
       }
     },
     "node_modules/puppeteer": {
-      "version": "19.4.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.4.0.tgz",
-      "integrity": "sha512-sRzWEfFSZCCcFUJflGtYI2V7A6qK4Jht+2JiI2LZgn+Nv/LOZZsBDEaGl98ZrS8oEcUA5on4p2yJbE0nzHNzIg==",
+      "version": "19.4.1",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.4.1.tgz",
+      "integrity": "sha512-PCnrR13B8A+VSEDXRmrNXRZbrkF1tfsI1hKSC7vs13eNS6CUD3Y4FA8SF8/VZy+Pm1kg5AggJT2Nu3HLAtGkFg==",
       "hasInstallScript": true,
       "dependencies": {
         "cosmiconfig": "8.0.0",
-        "devtools-protocol": "0.0.1068969",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.4.0"
+        "puppeteer-core": "19.4.1"
       },
       "engines": {
         "node": ">=14.1.0"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "19.4.0",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.4.0.tgz",
-      "integrity": "sha512-gG/jxseleZStinBn86x8r7trjcE4jcjx1hIQWOpACQhquHYMuKnrWxkzg+EDn8sN3wUtF/Ry9mtJgjM49oUOFQ==",
+      "version": "19.4.1",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.4.1.tgz",
+      "integrity": "sha512-JHIuqtqrUAx4jGOTxXu4ilapV2jabxtVMA/e4wwFUMvtSsqK4nVBSI+Z1SKDoz7gRy/JUIc8WzmfocCa6SIZ1w==",
       "dependencies": {
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
@@ -8492,7 +8498,7 @@
         "rimraf": "3.0.2",
         "tar-fs": "2.1.1",
         "unbzip2-stream": "1.4.3",
-        "ws": "8.10.0"
+        "ws": "8.11.0"
       },
       "engines": {
         "node": ">=14.1.0"
@@ -8574,12 +8580,12 @@
       }
     },
     "node_modules/query-string": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.1.tgz",
-      "integrity": "sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w==",
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
+      "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
       "optional": true,
       "dependencies": {
-        "decode-uri-component": "^0.2.0",
+        "decode-uri-component": "^0.2.2",
         "filter-obj": "^1.1.0",
         "split-on-first": "^1.0.0",
         "strict-uri-encode": "^2.0.0"
@@ -9025,9 +9031,9 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "node_modules/sanitize-html": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.0.tgz",
-      "integrity": "sha512-ZsGyc6avnqgvEm3eMKrcy8xa7WM1MrGrfkGsUgQee2CU+vg3PCfNCexXwBDF/6dEPvaQ4k/QqRjnYKHL8xgNjg==",
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.1.tgz",
+      "integrity": "sha512-qK5neD0SaMxGwVv5txOYv05huC3o6ZAA4h5+7nJJgWMNFUNRjcjLO6FpwAtKzfKCZ0jrG6xTk6eVFskbvOGblg==",
       "dependencies": {
         "deepmerge": "^4.2.2",
         "escape-string-regexp": "^4.0.0",
@@ -9132,9 +9138,9 @@
       "optional": true
     },
     "node_modules/sharp": {
-      "version": "0.31.2",
-      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.2.tgz",
-      "integrity": "sha512-DUdNVEXgS5A97cTagSLIIp8dUZ/lZtk78iNVZgHdHbx1qnQR7JAHY0BnXnwwH39Iw+VKhO08CTYhIg0p98vQ5Q==",
+      "version": "0.31.3",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz",
+      "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==",
       "hasInstallScript": true,
       "dependencies": {
         "color": "^4.2.3",
@@ -10313,9 +10319,9 @@
       }
     },
     "node_modules/ws": {
-      "version": "8.10.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz",
-      "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==",
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+      "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
       "engines": {
         "node": ">=10.0.0"
       },
@@ -11095,16 +11101,16 @@
       "integrity": "sha512-to5ZJuywKK3KX53X1ifOcWjvUTQcBGdQ6Qkhm8L97xQ3ovICag1048M3YMpc+QSdr8xWeCBMnLeMnENqotB0Og=="
     },
     "@googlemaps/google-maps-services-js": {
-      "version": "3.3.16",
-      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.16.tgz",
-      "integrity": "sha512-0YxWVR5tRCK4kgQNP48+K8yVMZt9Nvel49Ra37q25oopdUkxtLyO39DYCLFrqyk1K1ne+RmuNDKavPyQKpWMSw==",
+      "version": "3.3.26",
+      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.26.tgz",
+      "integrity": "sha512-/t0J/vLxPJcFsygSJU50WHgz2R3noAr7SkicthukD1HaEpMQ/O+llYt80R5yoO5cV9vMMDSqGUO7TvIEqiy3Ig==",
       "optional": true,
       "requires": {
         "@googlemaps/url-signature": "^1.0.4",
         "agentkeepalive": "^4.1.0",
-        "axios": "^0.27.0",
-        "query-string": "^7.0.1",
-        "retry-axios": "^2.2.1"
+        "axios": "0.27.2",
+        "query-string": "7.1.3",
+        "retry-axios": "2.6.0"
       },
       "dependencies": {
         "axios": {
@@ -12008,9 +12014,9 @@
       }
     },
     "@primer/octicons": {
-      "version": "17.10.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.0.tgz",
-      "integrity": "sha512-rg+NfA4M/SFutVzsqGwGWoKgXpHpTAbnoGvyGbkswT7iLV0PBFGJRkV61MhC61wEEF4SErMiaH5tOQKlvgvV9A==",
+      "version": "17.10.1",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.1.tgz",
+      "integrity": "sha512-fyq/lItQp18Ibi7c2oXVVw7H5K2a8qb8D2dnkTLf2+yUPjc3Fc+SEGS9x6iU6sQAEpr4LctcFl9ZSZ732EM63A==",
       "requires": {
         "object-assign": "^4.1.1"
       }
@@ -13197,9 +13203,9 @@
       "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
     },
     "d3": {
-      "version": "7.7.0",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.7.0.tgz",
-      "integrity": "sha512-VEwHCMgMjD2WBsxeRGUE18RmzxT9Bn7ghDpzvTEvkLSBAKgTMydJjouZTjspgQfRHpPt/PB3EHWBa6SSyFQq4g==",
+      "version": "7.8.0",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.0.tgz",
+      "integrity": "sha512-a5rNemRadWkEfqnY5NsD4RdCP9vn8EIJ4I5Rl14U0uKH1SXqcNmk/h9aGaAF1O98lz6L9M0IeUcuPa9GUYbI5A==",
       "requires": {
         "d3-array": "3",
         "d3-axis": "3",
@@ -16239,9 +16245,9 @@
       }
     },
     "marked": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.4.tgz",
-      "integrity": "sha512-Wcc9ikX7Q5E4BYDPvh1C6QNSxrjC9tBgz+A/vAhp59KXUgachw++uMvMKiSW8oA85nopmPZcEvBoex/YLMsiyA=="
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.5.tgz",
+      "integrity": "sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ=="
     },
     "matchmedia": {
       "version": "0.1.2",
@@ -16340,9 +16346,9 @@
       "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="
     },
     "minimatch": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz",
-      "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==",
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
+      "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==",
       "requires": {
         "brace-expansion": "^2.0.1"
       }
@@ -16592,9 +16598,9 @@
       }
     },
     "open-graph-scraper": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-5.0.1.tgz",
-      "integrity": "sha512-pxWxReziLjYBVEt6oy4bLpVGqKApPFV3BHD7YDE2TaGRB84NdRU8J0V7ihsCOkFxKKgiVH2M5jx0c59hDaehHQ==",
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-5.0.3.tgz",
+      "integrity": "sha512-TwDOwvQlm6h14chfjyzBXCHhW99SIU399cRQBcx0mxzl1fvIjDTlWVwAN2q7+A8YTfuvXoV2fwAYI+HmVVw5pg==",
       "requires": {
         "chardet": "^1.5.0",
         "cheerio": "^1.0.0-rc.12",
@@ -16944,22 +16950,21 @@
       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
     },
     "puppeteer": {
-      "version": "19.4.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.4.0.tgz",
-      "integrity": "sha512-sRzWEfFSZCCcFUJflGtYI2V7A6qK4Jht+2JiI2LZgn+Nv/LOZZsBDEaGl98ZrS8oEcUA5on4p2yJbE0nzHNzIg==",
+      "version": "19.4.1",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.4.1.tgz",
+      "integrity": "sha512-PCnrR13B8A+VSEDXRmrNXRZbrkF1tfsI1hKSC7vs13eNS6CUD3Y4FA8SF8/VZy+Pm1kg5AggJT2Nu3HLAtGkFg==",
       "requires": {
         "cosmiconfig": "8.0.0",
-        "devtools-protocol": "0.0.1068969",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.4.0"
+        "puppeteer-core": "19.4.1"
       }
     },
     "puppeteer-core": {
-      "version": "19.4.0",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.4.0.tgz",
-      "integrity": "sha512-gG/jxseleZStinBn86x8r7trjcE4jcjx1hIQWOpACQhquHYMuKnrWxkzg+EDn8sN3wUtF/Ry9mtJgjM49oUOFQ==",
+      "version": "19.4.1",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.4.1.tgz",
+      "integrity": "sha512-JHIuqtqrUAx4jGOTxXu4ilapV2jabxtVMA/e4wwFUMvtSsqK4nVBSI+Z1SKDoz7gRy/JUIc8WzmfocCa6SIZ1w==",
       "requires": {
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
@@ -16970,7 +16975,7 @@
         "rimraf": "3.0.2",
         "tar-fs": "2.1.1",
         "unbzip2-stream": "1.4.3",
-        "ws": "8.10.0"
+        "ws": "8.11.0"
       },
       "dependencies": {
         "debug": {
@@ -17027,12 +17032,12 @@
       }
     },
     "query-string": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.1.tgz",
-      "integrity": "sha512-MplouLRDHBZSG9z7fpuAAcI7aAYjDLhtsiVZsevsfaHWDS2IDdORKbSd1kWUA+V4zyva/HZoSfpwnYMMQDhb0w==",
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
+      "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
       "optional": true,
       "requires": {
-        "decode-uri-component": "^0.2.0",
+        "decode-uri-component": "^0.2.2",
         "filter-obj": "^1.1.0",
         "split-on-first": "^1.0.0",
         "strict-uri-encode": "^2.0.0"
@@ -17363,9 +17368,9 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "sanitize-html": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.0.tgz",
-      "integrity": "sha512-ZsGyc6avnqgvEm3eMKrcy8xa7WM1MrGrfkGsUgQee2CU+vg3PCfNCexXwBDF/6dEPvaQ4k/QqRjnYKHL8xgNjg==",
+      "version": "2.8.1",
+      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.1.tgz",
+      "integrity": "sha512-qK5neD0SaMxGwVv5txOYv05huC3o6ZAA4h5+7nJJgWMNFUNRjcjLO6FpwAtKzfKCZ0jrG6xTk6eVFskbvOGblg==",
       "requires": {
         "deepmerge": "^4.2.2",
         "escape-string-regexp": "^4.0.0",
@@ -17457,9 +17462,9 @@
       "optional": true
     },
     "sharp": {
-      "version": "0.31.2",
-      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.2.tgz",
-      "integrity": "sha512-DUdNVEXgS5A97cTagSLIIp8dUZ/lZtk78iNVZgHdHbx1qnQR7JAHY0BnXnwwH39Iw+VKhO08CTYhIg0p98vQ5Q==",
+      "version": "0.31.3",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz",
+      "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==",
       "requires": {
         "color": "^4.2.3",
         "detect-libc": "^2.0.1",
@@ -18365,9 +18370,9 @@
       }
     },
     "ws": {
-      "version": "8.10.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.10.0.tgz",
-      "integrity": "sha512-+s49uSmZpvtAsd2h37vIPy1RBusaLawVe8of+GyEPsaJTCMpj/2v8NpeK1SHXjBlQ95lQTmQofOJnFiLoaN3yw==",
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+      "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
       "requires": {}
     },
     "xml": {
diff --git a/package.json b/package.json
index 3c142c6cd02..45bde02d66d 100644
--- a/package.json
+++ b/package.json
@@ -35,12 +35,12 @@
     "@octokit/graphql": "^5.0.4",
     "@octokit/rest": "^19.0.5",
     "@primer/css": "^20.8.0",
-    "@primer/octicons": "^17.10.0",
+    "@primer/octicons": "^17.10.1",
     "axios": "^1.1.3",
     "clipboard": "^2.0.11",
     "compression": "^1.7.4",
     "csso": "^5.0.5",
-    "d3": "^7.7.0",
+    "d3": "^7.8.0",
     "d3-node": "^3.0.0",
     "ejs": "^3.1.8",
     "emoji-name-map": "^1.2.9",
@@ -49,18 +49,18 @@
     "file-type": "^18.0.0",
     "js-yaml": "^4.1.0",
     "linguist-js": "^2.5.3",
-    "marked": "^4.2.4",
+    "marked": "^4.2.5",
     "memory-cache": "^0.2.0",
-    "minimatch": "^5.1.1",
+    "minimatch": "^5.1.2",
     "node-fetch": "^3.3.0",
-    "open-graph-scraper": "^5.0.1",
+    "open-graph-scraper": "^5.0.3",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^19.4.0",
+    "puppeteer": "^19.4.1",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.12.0",
-    "sanitize-html": "^2.8.0",
-    "sharp": "^0.31.2",
+    "sanitize-html": "^2.8.1",
+    "sharp": "^0.31.3",
     "simple-git": "^3.15.1",
     "svgo": "^3.0.2",
     "twemoji-parser": "^14.0.0",
@@ -79,7 +79,7 @@
     "transform": {}
   },
   "optionalDependencies": {
-    "@googlemaps/google-maps-services-js": "^3.3.16",
+    "@googlemaps/google-maps-services-js": "^3.3.26",
     "chess.js": "^1.0.0-alpha.0",
     "color": "^4.2.3",
     "gifencoder": "^2.0.1",

From b6427391a17f23136c850f2574ee40f5e1e63f4f Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 8 Jan 2023 12:59:59 -0500
Subject: [PATCH 046/196] fix(plugins/stargazers): bad scale when not enough
 values [skip ci]

---
 source/plugins/stargazers/worldmap/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/stargazers/worldmap/index.mjs b/source/plugins/stargazers/worldmap/index.mjs
index 2f718de1cf9..c669e3875a1 100644
--- a/source/plugins/stargazers/worldmap/index.mjs
+++ b/source/plugins/stargazers/worldmap/index.mjs
@@ -42,7 +42,7 @@ export default async function(login, {locations, sample, imports, token}) {
   const svg = d3n.createSVG(480, 315)
   const countries = JSON.parse(await imports.fs.readFile(imports.paths.join(imports.__module(import.meta.url), "atlas/50m_countries.geojson")))
   const geopath = d3.geoPath(d3.geoMercator().fitWidth(svg.attr("width"), countries))
-  const splits = [...new Set(stars.values())].sort((a, b) => a - b)
+  const splits = [...new Set([0, ...stars.values()])].sort((a, b) => a - b)
   svg
     .append("g")
     .selectAll("path")

From d2c70c4e21da2fc8272aa1727ec25fc0b07b733f Mon Sep 17 00:00:00 2001
From: xxchan <xxchan22f@gmail.com>
Date: Sun, 8 Jan 2023 19:01:13 +0100
Subject: [PATCH 047/196] docs: Add an example for preventing GitHub from auto
 linking to the image (#1339) [skip ci]

---
 .github/readme/partials/documentation/setup/action.md | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/.github/readme/partials/documentation/setup/action.md b/.github/readme/partials/documentation/setup/action.md
index 20e884261f2..1b5d3734bfc 100644
--- a/.github/readme/partials/documentation/setup/action.md
+++ b/.github/readme/partials/documentation/setup/action.md
@@ -130,6 +130,13 @@ Update profile `README.md` to include rendered image (filename may differ if `fi
 <img align="center" src="/github-metrics.svg" alt="Metrics" width="400">
 ```
 
+*Example: add rendered image and prevent GitHub from auto linking to the image*
+```html
+<picture>
+  <img src="/github-metrics.svg" alt="Metrics">
+</picture>
+```
+
 *Example: add rendered image when using `config_display: columns`*
 ```html
 <img src="/github-metrics.svg" alt="Metrics" width="100%">

From ce8daa099bb732cb86e7a1d9168164985ccce4b0 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 9 Jan 2023 02:37:35 -0500
Subject: [PATCH 048/196] feat(plugins/core): add support for `--winter` debug
 flag (#1341)

---
 source/plugins/core/index.mjs       | 31 ++++++++++++++++++-----------
 source/plugins/core/metadata.yml    |  4 +++-
 source/templates/classic/style.css  |  4 ++++
 source/templates/terminal/style.css |  4 ++++
 4 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/source/plugins/core/index.mjs b/source/plugins/core/index.mjs
index f5aae8ba8e1..25fb23f4572 100644
--- a/source/plugins/core/index.mjs
+++ b/source/plugins/core/index.mjs
@@ -144,25 +144,32 @@ export default async function({login, q}, {conf, data, rest, graphql, plugins, q
     console.debug(`metrics/compute/${login} > applying dflag --cakeday`)
     computed.cakeday = true
   }
-  if (dflags.includes("--halloween")) {
+  if ((dflags.includes("--halloween"))||(dflags.includes("--winter"))) {
+    const color = dflags.find(color => ["--halloween", "--winter"].includes(color)).replace("--", "")
     console.debug(`metrics/compute/${login} > applying dflag --halloween`)
-    //Halloween color replacer
-    const halloween = content =>
+    //Color replacer
+    const replace = content =>
       content
-        .replace(/--color-calendar-graph/g, "--color-calendar-halloween-graph")
-        .replace(/#9be9a8/gi, "var(--color-calendar-halloween-graph-day-L1-bg)")
-        .replace(/#40c463/gi, "var(--color-calendar-halloween-graph-day-L2-bg)")
-        .replace(/#30a14e/gi, "var(--color-calendar-halloween-graph-day-L3-bg)")
-        .replace(/#216e39/gi, "var(--color-calendar-halloween-graph-day-L4-bg)")
+        .replace(/--color-calendar-graph/g, `--color-calendar-${color}-graph`)
+        .replace(/#9be9a8/gi, `var(--color-calendar-${color}-graph-day-L1-bg)`)
+        .replace(/#40c463/gi, `var(--color-calendar-${color}-graph-day-L2-bg)`)
+        .replace(/#30a14e/gi, `var(--color-calendar-${color}-graph-day-L3-bg)`)
+        .replace(/#216e39/gi, `var(--color-calendar-${color}-graph-day-L4-bg)`)
     //Update contribution calendar colors
-    computed.calendar.map(day => day.color = halloween(day.color))
-    //Update isocalendar colors
+    computed.calendar.map(day => day.color = replace(day.color))
+    //Update calendars colors
     const waiting = [...pending]
     pending.push((async () => {
       await Promise.all(waiting)
       if (data.plugins.isocalendar?.svg)
-        data.plugins.isocalendar.svg = halloween(data.plugins.isocalendar.svg)
-      return {name: "dflag.halloween", result: true}
+        data.plugins.isocalendar.svg = replace(data.plugins.isocalendar.svg)
+      if (data.plugins.calendar?.years) {
+        for (const {weeks} of data.plugins.calendar.years) {
+          for (const {contributionDays} of weeks)
+            contributionDays.forEach(day => day.color = replace(day.color))
+        }
+      }
+      return {name: `dflag.${color}`, result: true}
     })())
   }
   if (dflags.includes("--error")) {
diff --git a/source/plugins/core/metadata.yml b/source/plugins/core/metadata.yml
index 6da248addfd..07331d7c5b1 100644
--- a/source/plugins/core/metadata.yml
+++ b/source/plugins/core/metadata.yml
@@ -536,7 +536,8 @@ inputs:
     description: |
       Debug flags
       - `--cakeday`: simulate registration anniversary
-      - `--halloween`: enable halloween colors
+      - `--halloween`: enable halloween colors *(only first color scheme will be applied if multiple are specified)*
+      - `--winter`: enable winter colors *(only first color scheme will be applied if multiple are specified)*
       - `--error`: force render error
       - `--puppeteer-debug`: enable puppeteer debug mode\*
       - `--puppeteer-disable-headless`: disable puppeteer headless mode *(requires a graphical environment)*\*
@@ -554,6 +555,7 @@ inputs:
     values:
       - --cakeday
       - --halloween
+      - --winter
       - --error
       - --puppeteer-debug
       - --puppeteer-disable-headless
diff --git a/source/templates/classic/style.css b/source/templates/classic/style.css
index 6e562ccd88f..f7788019532 100644
--- a/source/templates/classic/style.css
+++ b/source/templates/classic/style.css
@@ -1560,6 +1560,10 @@
     --color-calendar-halloween-graph-day-L2-bg: #ffc501;
     --color-calendar-halloween-graph-day-L3-bg: #fe9600;
     --color-calendar-halloween-graph-day-L4-bg: #03001c;
+    --color-calendar-winter-graph-day-L1-bg: #0a3069;
+    --color-calendar-winter-graph-day-L2-bg: #0969da;
+    --color-calendar-winter-graph-day-L3-bg: #54aeff;
+    --color-calendar-winter-graph-day-L4-bg: #b6e3ff;
     --color-calendar-graph-day-L4-border: rgba(27,31,35,0.06);
     --color-calendar-graph-day-L3-border: rgba(27,31,35,0.06);
     --color-calendar-graph-day-L2-border: rgba(27,31,35,0.06);
diff --git a/source/templates/terminal/style.css b/source/templates/terminal/style.css
index 3492118eb96..42b02b63ec7 100644
--- a/source/templates/terminal/style.css
+++ b/source/templates/terminal/style.css
@@ -140,6 +140,10 @@
     --color-calendar-halloween-graph-day-L2-bg: #ffc501;
     --color-calendar-halloween-graph-day-L3-bg: #fe9600;
     --color-calendar-halloween-graph-day-L4-bg: #03001c;
+    --color-calendar-winter-graph-day-L1-bg: #0a3069;
+    --color-calendar-winter-graph-day-L2-bg: #0969da;
+    --color-calendar-winter-graph-day-L3-bg: #54aeff;
+    --color-calendar-winter-graph-day-L4-bg: #b6e3ff;
     --color-calendar-graph-day-L4-border: rgba(27,31,35,0.06);
     --color-calendar-graph-day-L3-border: rgba(27,31,35,0.06);
     --color-calendar-graph-day-L2-border: rgba(27,31,35,0.06);

From 013b9f87726f93d823da06908ea9222fe11ae782 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 9 Jan 2023 08:18:25 +0000
Subject: [PATCH 049/196] chore: code formatting

---
 source/plugins/core/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/core/index.mjs b/source/plugins/core/index.mjs
index 25fb23f4572..57c65261452 100644
--- a/source/plugins/core/index.mjs
+++ b/source/plugins/core/index.mjs
@@ -144,7 +144,7 @@ export default async function({login, q}, {conf, data, rest, graphql, plugins, q
     console.debug(`metrics/compute/${login} > applying dflag --cakeday`)
     computed.cakeday = true
   }
-  if ((dflags.includes("--halloween"))||(dflags.includes("--winter"))) {
+  if ((dflags.includes("--halloween")) || (dflags.includes("--winter"))) {
     const color = dflags.find(color => ["--halloween", "--winter"].includes(color)).replace("--", "")
     console.debug(`metrics/compute/${login} > applying dflag --halloween`)
     //Color replacer

From 4141dd5a5bff259430398d328027afeeb74b03d8 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 9 Jan 2023 08:19:19 +0000
Subject: [PATCH 050/196] ci: auto-regenerate files

---
 README.md                                     | 2 ++
 source/plugins/community/screenshot/README.md | 3 +--
 source/plugins/core/README.md                 | 5 +++--
 3 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/README.md b/README.md
index 52dce52338a..fd5066098d3 100644
--- a/README.md
+++ b/README.md
@@ -429,6 +429,8 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
 # 📚 Documentation
 
 
+> <sup>*⚠️ This is the documentation of **v3.32-beta** (`@master`/`@main` branches) which includes [unreleased features](https://github.com/lowlighter/metrics/compare/latest...master) planned for next release. See documentation for current released version [**v3.31** (`@latest` branch) here](https://github.com/lowlighter/metrics/blob/latest/README.md).* </sup>
+
 
 
 ## 🦮 Setup
diff --git a/source/plugins/community/screenshot/README.md b/source/plugins/community/screenshot/README.md
index 2fc47d120d5..cf02e99a35c 100644
--- a/source/plugins/community/screenshot/README.md
+++ b/source/plugins/community/screenshot/README.md
@@ -88,8 +88,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> image<br>
 <b>allowed values:</b><ul><li>image</li><li>text</li></ul></td>
diff --git a/source/plugins/core/README.md b/source/plugins/core/README.md
index 3a0a9952402..518a3f3bdf3 100644
--- a/source/plugins/core/README.md
+++ b/source/plugins/core/README.md
@@ -1114,7 +1114,8 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
     <td rowspan="2"><p>Debug flags</p>
 <ul>
 <li><code>--cakeday</code>: simulate registration anniversary</li>
-<li><code>--halloween</code>: enable halloween colors</li>
+<li><code>--halloween</code>: enable halloween colors <em>(only first color scheme will be applied if multiple are specified)</em></li>
+<li><code>--winter</code>: enable winter colors <em>(only first color scheme will be applied if multiple are specified)</em></li>
 <li><code>--error</code>: force render error</li>
 <li><code>--puppeteer-debug</code>: enable puppeteer debug mode*</li>
 <li><code>--puppeteer-disable-headless</code>: disable puppeteer headless mode <em>(requires a graphical environment)</em>*</li>
@@ -1137,7 +1138,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
 <b>type:</b> <code>array</code>
 <i>(space-separated)</i>
 <br>
-<b>allowed values:</b><ul><li>--cakeday</li><li>--halloween</li><li>--error</li><li>--puppeteer-debug</li><li>--puppeteer-disable-headless</li><li>--puppeteer-wait-load</li><li>--puppeteer-wait-domcontentloaded</li><li>--puppeteer-wait-networkidle0</li><li>--puppeteer-wait-networkidle2</li></ul></td>
+<b>allowed values:</b><ul><li>--cakeday</li><li>--halloween</li><li>--winter</li><li>--error</li><li>--puppeteer-debug</li><li>--puppeteer-disable-headless</li><li>--puppeteer-wait-load</li><li>--puppeteer-wait-domcontentloaded</li><li>--puppeteer-wait-networkidle0</li><li>--puppeteer-wait-networkidle2</li></ul></td>
   </tr>
   <tr>
     <td nowrap="nowrap"><h4><code>debug_print</code></h4></td>

From cec8d889ac8f58c13b31f1de7642f991e290906b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Fri, 13 Jan 2023 00:22:48 -0500
Subject: [PATCH 051/196] chore(deps): bump puppeteer from 19.4.1 to 19.5.0
 (#1342)

---
 package-lock.json | 39 ++++++++++++++++-----------------------
 package.json      |  2 +-
 2 files changed, 17 insertions(+), 24 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e859df560ff..661bbc1e82f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,15 +13,12 @@
         "@actions/core": "^1.10.0",
         "@actions/github": "^5.1.1",
         "@faker-js/faker": "^7.6.0",
-        "@googlemaps/google-maps-services-js": "^3.3.26",
         "@octokit/graphql": "^5.0.4",
         "@octokit/rest": "^19.0.5",
         "@primer/css": "^20.8.0",
         "@primer/octicons": "^17.10.1",
         "axios": "^1.1.3",
-        "chess.js": "^1.0.0-alpha.0",
         "clipboard": "^2.0.11",
-        "color": "^4.2.3",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
         "d3": "^7.8.0",
@@ -31,20 +28,17 @@
         "express": "^4.18.2",
         "express-rate-limit": "^6.7.0",
         "file-type": "^18.0.0",
-        "gifencoder": "^2.0.1",
         "js-yaml": "^4.1.0",
         "linguist-js": "^2.5.3",
         "marked": "^4.2.5",
         "memory-cache": "^0.2.0",
         "minimatch": "^5.1.2",
-        "node-chartist": "^1.0.5",
         "node-fetch": "^3.3.0",
         "open-graph-scraper": "^5.0.3",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^19.4.1",
+        "puppeteer": "^19.5.0",
         "purgecss": "^5.0.0",
-        "rss": "^1.2.2",
         "rss-parser": "^3.12.0",
         "sanitize-html": "^2.8.1",
         "sharp": "^0.31.3",
@@ -53,8 +47,7 @@
         "twemoji-parser": "^14.0.0",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
-        "xml-formatter": "^3.2.0",
-        "yargs-parser": "^21.1.1"
+        "xml-formatter": "^3.2.0"
       },
       "devDependencies": {
         "eslint": "^8.31.0",
@@ -8469,25 +8462,25 @@
       }
     },
     "node_modules/puppeteer": {
-      "version": "19.4.1",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.4.1.tgz",
-      "integrity": "sha512-PCnrR13B8A+VSEDXRmrNXRZbrkF1tfsI1hKSC7vs13eNS6CUD3Y4FA8SF8/VZy+Pm1kg5AggJT2Nu3HLAtGkFg==",
+      "version": "19.5.0",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.5.0.tgz",
+      "integrity": "sha512-601tKJdKu/mlL6l5wklNJiQbIxyEU2N4pwZzFkwhr1VizNYV0Fly1aFMT7qAp7CvzklYLypQGKn7/Zgpy+HheA==",
       "hasInstallScript": true,
       "dependencies": {
         "cosmiconfig": "8.0.0",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.4.1"
+        "puppeteer-core": "19.5.0"
       },
       "engines": {
         "node": ">=14.1.0"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "19.4.1",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.4.1.tgz",
-      "integrity": "sha512-JHIuqtqrUAx4jGOTxXu4ilapV2jabxtVMA/e4wwFUMvtSsqK4nVBSI+Z1SKDoz7gRy/JUIc8WzmfocCa6SIZ1w==",
+      "version": "19.5.0",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.5.0.tgz",
+      "integrity": "sha512-s2EE2x/7UfvR4AP+6OokY7yEmIboZoQFc2InuWUu5grWG7uka3W2Nch6+R4ERQepH4NO8kkkEBzNO4PqtwU4lQ==",
       "dependencies": {
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
@@ -16950,21 +16943,21 @@
       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
     },
     "puppeteer": {
-      "version": "19.4.1",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.4.1.tgz",
-      "integrity": "sha512-PCnrR13B8A+VSEDXRmrNXRZbrkF1tfsI1hKSC7vs13eNS6CUD3Y4FA8SF8/VZy+Pm1kg5AggJT2Nu3HLAtGkFg==",
+      "version": "19.5.0",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.5.0.tgz",
+      "integrity": "sha512-601tKJdKu/mlL6l5wklNJiQbIxyEU2N4pwZzFkwhr1VizNYV0Fly1aFMT7qAp7CvzklYLypQGKn7/Zgpy+HheA==",
       "requires": {
         "cosmiconfig": "8.0.0",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.4.1"
+        "puppeteer-core": "19.5.0"
       }
     },
     "puppeteer-core": {
-      "version": "19.4.1",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.4.1.tgz",
-      "integrity": "sha512-JHIuqtqrUAx4jGOTxXu4ilapV2jabxtVMA/e4wwFUMvtSsqK4nVBSI+Z1SKDoz7gRy/JUIc8WzmfocCa6SIZ1w==",
+      "version": "19.5.0",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.5.0.tgz",
+      "integrity": "sha512-s2EE2x/7UfvR4AP+6OokY7yEmIboZoQFc2InuWUu5grWG7uka3W2Nch6+R4ERQepH4NO8kkkEBzNO4PqtwU4lQ==",
       "requires": {
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
diff --git a/package.json b/package.json
index 45bde02d66d..14424c3e792 100644
--- a/package.json
+++ b/package.json
@@ -56,7 +56,7 @@
     "open-graph-scraper": "^5.0.3",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^19.4.1",
+    "puppeteer": "^19.5.0",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.12.0",
     "sanitize-html": "^2.8.1",

From 7bb3fbd314508d27e2c95afeb513a7035c60bd06 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 16 Jan 2023 18:50:50 -0500
Subject: [PATCH 052/196] chore(deps): bump eslint from 8.31.0 to 8.32.0
 (#1351) [skip ci]

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 661bbc1e82f..6eddb974be2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,7 +50,7 @@
         "xml-formatter": "^3.2.0"
       },
       "devDependencies": {
-        "eslint": "^8.31.0",
+        "eslint": "^8.32.0",
         "jest": "^29.3.1",
         "libxmljs2": "^0.31.0"
       },
@@ -4976,9 +4976,9 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.31.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz",
-      "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==",
+      "version": "8.32.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz",
+      "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==",
       "dev": true,
       "dependencies": {
         "@eslint/eslintrc": "^1.4.1",
@@ -14345,9 +14345,9 @@
       }
     },
     "eslint": {
-      "version": "8.31.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.31.0.tgz",
-      "integrity": "sha512-0tQQEVdmPZ1UtUKXjX7EMm9BlgJ08G90IhWh0PKDCb3ZLsgAOHI8fYSIzYVZej92zsgq+ft0FGsxhJ3xo2tbuA==",
+      "version": "8.32.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz",
+      "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==",
       "dev": true,
       "requires": {
         "@eslint/eslintrc": "^1.4.1",
diff --git a/package.json b/package.json
index 14424c3e792..524652ad837 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,7 @@
     "xml-formatter": "^3.2.0"
   },
   "devDependencies": {
-    "eslint": "^8.31.0",
+    "eslint": "^8.32.0",
     "jest": "^29.3.1",
     "libxmljs2": "^0.31.0"
   },

From 580e86e888acef167bd0e5cadf313c1e38b52e6c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 16 Jan 2023 18:51:01 -0500
Subject: [PATCH 053/196] chore(deps): bump simple-git from 3.15.1 to 3.16.0
 (#1352) [skip ci]

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6eddb974be2..6e93fce026c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -42,7 +42,7 @@
         "rss-parser": "^3.12.0",
         "sanitize-html": "^2.8.1",
         "sharp": "^0.31.3",
-        "simple-git": "^3.15.1",
+        "simple-git": "^3.16.0",
         "svgo": "^3.0.2",
         "twemoji-parser": "^14.0.0",
         "vue": "^2.7.1",
@@ -9279,9 +9279,9 @@
       }
     },
     "node_modules/simple-git": {
-      "version": "3.15.1",
-      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.15.1.tgz",
-      "integrity": "sha512-73MVa5984t/JP4JcQt0oZlKGr42ROYWC3BcUZfuHtT3IHKPspIvL0cZBnvPXF7LL3S/qVeVHVdYYmJ3LOTw4Rg==",
+      "version": "3.16.0",
+      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz",
+      "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==",
       "dependencies": {
         "@kwsites/file-exists": "^1.1.1",
         "@kwsites/promise-deferred": "^1.1.1",
@@ -17553,9 +17553,9 @@
       }
     },
     "simple-git": {
-      "version": "3.15.1",
-      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.15.1.tgz",
-      "integrity": "sha512-73MVa5984t/JP4JcQt0oZlKGr42ROYWC3BcUZfuHtT3IHKPspIvL0cZBnvPXF7LL3S/qVeVHVdYYmJ3LOTw4Rg==",
+      "version": "3.16.0",
+      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz",
+      "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==",
       "requires": {
         "@kwsites/file-exists": "^1.1.1",
         "@kwsites/promise-deferred": "^1.1.1",
diff --git a/package.json b/package.json
index 524652ad837..b65b3e25632 100644
--- a/package.json
+++ b/package.json
@@ -61,7 +61,7 @@
     "rss-parser": "^3.12.0",
     "sanitize-html": "^2.8.1",
     "sharp": "^0.31.3",
-    "simple-git": "^3.15.1",
+    "simple-git": "^3.16.0",
     "svgo": "^3.0.2",
     "twemoji-parser": "^14.0.0",
     "vue": "^2.7.1",

From 7427a557cdc6860fa97abc718d5d666e5ab9106c Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 16 Jan 2023 18:51:30 -0500
Subject: [PATCH 054/196] chore(deps): bump file-type from 18.0.0 to 18.2.0
 (#1353) [skip ci]

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6e93fce026c..a24b5bc6c52 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -27,7 +27,7 @@
         "emoji-name-map": "^1.2.9",
         "express": "^4.18.2",
         "express-rate-limit": "^6.7.0",
-        "file-type": "^18.0.0",
+        "file-type": "^18.2.0",
         "js-yaml": "^4.1.0",
         "linguist-js": "^2.5.3",
         "marked": "^4.2.5",
@@ -5557,9 +5557,9 @@
       }
     },
     "node_modules/file-type": {
-      "version": "18.0.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.0.0.tgz",
-      "integrity": "sha512-jjMwFpnW8PKofLE/4ohlhqwDk5k0NC6iy0UHAJFKoY1fQeGMN0GDdLgHQrvCbSpMwbqzoCZhRI5dETCZna5qVA==",
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.0.tgz",
+      "integrity": "sha512-M3RQMWY3F2ykyWZ+IHwNCjpnUmukYhtdkGGC1ZVEUb0ve5REGF7NNJ4Q9ehCUabtQKtSVFOMbFTXgJlFb0DQIg==",
       "dependencies": {
         "readable-web-to-node-stream": "^3.0.2",
         "strtok3": "^7.0.0",
@@ -14764,9 +14764,9 @@
       }
     },
     "file-type": {
-      "version": "18.0.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.0.0.tgz",
-      "integrity": "sha512-jjMwFpnW8PKofLE/4ohlhqwDk5k0NC6iy0UHAJFKoY1fQeGMN0GDdLgHQrvCbSpMwbqzoCZhRI5dETCZna5qVA==",
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.0.tgz",
+      "integrity": "sha512-M3RQMWY3F2ykyWZ+IHwNCjpnUmukYhtdkGGC1ZVEUb0ve5REGF7NNJ4Q9ehCUabtQKtSVFOMbFTXgJlFb0DQIg==",
       "requires": {
         "readable-web-to-node-stream": "^3.0.2",
         "strtok3": "^7.0.0",
diff --git a/package.json b/package.json
index b65b3e25632..e0f5721a4fd 100644
--- a/package.json
+++ b/package.json
@@ -46,7 +46,7 @@
     "emoji-name-map": "^1.2.9",
     "express": "^4.18.2",
     "express-rate-limit": "^6.7.0",
-    "file-type": "^18.0.0",
+    "file-type": "^18.2.0",
     "js-yaml": "^4.1.0",
     "linguist-js": "^2.5.3",
     "marked": "^4.2.5",

From 69e5bfb319dfa8da30fbadc7f2510e66872e1bdc Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 16 Jan 2023 18:56:42 -0500
Subject: [PATCH 055/196] chore(deps): bump minimatch from 5.1.2 to 6.0.4
 (#1354) [skip ci]

---
 package-lock.json | 57 +++++++++++++++++++++++++++++++++++++++++------
 package.json      |  2 +-
 2 files changed, 51 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index a24b5bc6c52..fd3747fa710 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -32,7 +32,7 @@
         "linguist-js": "^2.5.3",
         "marked": "^4.2.5",
         "memory-cache": "^0.2.0",
-        "minimatch": "^5.1.2",
+        "minimatch": "^6.0.4",
         "node-fetch": "^3.3.0",
         "open-graph-scraper": "^5.0.3",
         "png-js": "^1.0.0",
@@ -5586,6 +5586,17 @@
         "minimatch": "^5.0.1"
       }
     },
+    "node_modules/filelist/node_modules/minimatch": {
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
+      "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -7637,14 +7648,17 @@
       }
     },
     "node_modules/minimatch": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
-      "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==",
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.0.4.tgz",
+      "integrity": "sha512-9SQupyyavjdAc1VFjJS/5kdtFtlLAhKSWt7HocG0h/npy626jYrGegSslcM7Xxet5z0U9GOx9YbcpyIjBzn7tA==",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
       "engines": {
         "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
     "node_modules/minimist": {
@@ -8558,6 +8572,17 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/purgecss/node_modules/minimatch": {
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
+      "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/qs": {
       "version": "6.11.0",
       "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
@@ -14785,6 +14810,16 @@
       "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==",
       "requires": {
         "minimatch": "^5.0.1"
+      },
+      "dependencies": {
+        "minimatch": {
+          "version": "5.1.4",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
+          "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
+        }
       }
     },
     "fill-range": {
@@ -16339,9 +16374,9 @@
       "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="
     },
     "minimatch": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.2.tgz",
-      "integrity": "sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg==",
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.0.4.tgz",
+      "integrity": "sha512-9SQupyyavjdAc1VFjJS/5kdtFtlLAhKSWt7HocG0h/npy626jYrGegSslcM7Xxet5z0U9GOx9YbcpyIjBzn7tA==",
       "requires": {
         "brace-expansion": "^2.0.1"
       }
@@ -17013,6 +17048,14 @@
             "minimatch": "^5.0.1",
             "once": "^1.3.0"
           }
+        },
+        "minimatch": {
+          "version": "5.1.4",
+          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
+          "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
+          "requires": {
+            "brace-expansion": "^2.0.1"
+          }
         }
       }
     },
diff --git a/package.json b/package.json
index e0f5721a4fd..7b4ed56c7eb 100644
--- a/package.json
+++ b/package.json
@@ -51,7 +51,7 @@
     "linguist-js": "^2.5.3",
     "marked": "^4.2.5",
     "memory-cache": "^0.2.0",
-    "minimatch": "^5.1.2",
+    "minimatch": "^6.0.4",
     "node-fetch": "^3.3.0",
     "open-graph-scraper": "^5.0.3",
     "png-js": "^1.0.0",

From 8fd714d79c4e50aae4c3cf7e9a9b6a2db7636264 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 16 Jan 2023 20:12:42 -0500
Subject: [PATCH 056/196] feat(app/metrics/utils): remove dependencies on
 d3-node (#1329) [skip ci]

---
 package-lock.json                            | 6523 ++++++++----------
 package.json                                 |    2 +-
 source/app/metrics/utils.mjs                 |   27 +-
 source/plugins/stargazers/worldmap/index.mjs |    4 +-
 4 files changed, 2959 insertions(+), 3597 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index fd3747fa710..6d3ad008f9f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,13 +22,13 @@
         "compression": "^1.7.4",
         "csso": "^5.0.5",
         "d3": "^7.8.0",
-        "d3-node": "^3.0.0",
         "ejs": "^3.1.8",
         "emoji-name-map": "^1.2.9",
         "express": "^4.18.2",
         "express-rate-limit": "^6.7.0",
         "file-type": "^18.2.0",
         "js-yaml": "^4.1.0",
+        "jsdom": "^20.0.3",
         "linguist-js": "^2.5.3",
         "marked": "^4.2.5",
         "memory-cache": "^0.2.0",
@@ -2062,14 +2062,6 @@
       "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
       "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="
     },
-    "node_modules/@tootallnate/once": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-      "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/@trysound/sax": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
@@ -2210,10 +2202,9 @@
       }
     },
     "node_modules/abab": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
-      "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==",
-      "optional": true
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+      "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
     },
     "node_modules/abbrev": {
       "version": "1.1.1",
@@ -2234,9 +2225,9 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.8.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
-      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==",
+      "version": "8.8.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
+      "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -2245,22 +2236,18 @@
       }
     },
     "node_modules/acorn-globals": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
-      "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==",
-      "optional": true,
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
+      "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
       "dependencies": {
-        "acorn": "^4.0.4"
+        "acorn": "^8.1.0",
+        "acorn-walk": "^8.0.2"
       }
     },
-    "node_modules/acorn-globals/node_modules/acorn": {
-      "version": "4.0.13",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
-      "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==",
-      "optional": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
+    "node_modules/acorn-globals/node_modules/acorn-walk": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+      "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
       "engines": {
         "node": ">=0.4.0"
       }
@@ -2274,14 +2261,6 @@
         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
     },
-    "node_modules/acorn-walk": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
-      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
     "node_modules/agent-base": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -2787,11 +2766,6 @@
         "brfs": "bin/cmd.js"
       }
     },
-    "node_modules/browser-process-hrtime": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
-      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
-    },
     "node_modules/browserslist": {
       "version": "4.21.4",
       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
@@ -3486,20 +3460,26 @@
       }
     },
     "node_modules/cssom": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-      "optional": true
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+      "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="
     },
     "node_modules/cssstyle": {
-      "version": "0.2.37",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
-      "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==",
-      "optional": true,
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
       "dependencies": {
-        "cssom": "0.3.x"
+        "cssom": "~0.3.6"
+      },
+      "engines": {
+        "node": ">=8"
       }
     },
+    "node_modules/cssstyle/node_modules/cssom": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+    },
     "node_modules/csstype": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
@@ -3590,11 +3570,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/d3-collection": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz",
-      "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
-    },
     "node_modules/d3-color": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
@@ -3750,2106 +3725,1923 @@
         "node": ">=12"
       }
     },
-    "node_modules/d3-node": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-node/-/d3-node-3.0.0.tgz",
-      "integrity": "sha512-JuuBToljSQBo+KHSuPVOEdKawsxuLDlrB8TZY8AkPkpvyKaGgX+g0ksgjRg+Mgat9fB77qFQrk09j72cD0yk7w==",
-      "dependencies": {
-        "d3": "^5.16.0",
-        "jsdom": "^16.7.0"
+    "node_modules/d3-path": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz",
+      "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==",
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/abab": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
-      "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
-    },
-    "node_modules/d3-node/node_modules/acorn-globals": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
-      "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
-      "dependencies": {
-        "acorn": "^7.1.1",
-        "acorn-walk": "^7.1.1"
+    "node_modules/d3-polygon": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
+      "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/acorn-globals/node_modules/acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "bin": {
-        "acorn": "bin/acorn"
-      },
+    "node_modules/d3-quadtree": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
+      "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
       "engines": {
-        "node": ">=0.4.0"
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/commander": {
-      "version": "2.20.3",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
-    },
-    "node_modules/d3-node/node_modules/cssom": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
-      "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
+    "node_modules/d3-random": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
+      "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "node_modules/d3-node/node_modules/cssstyle": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
-      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+    "node_modules/d3-scale": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
+      "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
       "dependencies": {
-        "cssom": "~0.3.6"
+        "d3-array": "2.10.0 - 3",
+        "d3-format": "1 - 3",
+        "d3-interpolate": "1.2.0 - 3",
+        "d3-time": "2.1.1 - 3",
+        "d3-time-format": "2 - 4"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/cssstyle/node_modules/cssom": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
-    },
-    "node_modules/d3-node/node_modules/d3": {
-      "version": "5.16.0",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz",
-      "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==",
-      "dependencies": {
-        "d3-array": "1",
-        "d3-axis": "1",
-        "d3-brush": "1",
-        "d3-chord": "1",
-        "d3-collection": "1",
-        "d3-color": "1",
-        "d3-contour": "1",
-        "d3-dispatch": "1",
-        "d3-drag": "1",
-        "d3-dsv": "1",
-        "d3-ease": "1",
-        "d3-fetch": "1",
-        "d3-force": "1",
-        "d3-format": "1",
-        "d3-geo": "1",
-        "d3-hierarchy": "1",
-        "d3-interpolate": "1",
-        "d3-path": "1",
-        "d3-polygon": "1",
-        "d3-quadtree": "1",
-        "d3-random": "1",
-        "d3-scale": "2",
-        "d3-scale-chromatic": "1",
-        "d3-selection": "1",
-        "d3-shape": "1",
-        "d3-time": "1",
-        "d3-time-format": "2",
-        "d3-timer": "1",
-        "d3-transition": "1",
-        "d3-voronoi": "1",
-        "d3-zoom": "1"
-      }
-    },
-    "node_modules/d3-node/node_modules/d3-array": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
-      "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
-    },
-    "node_modules/d3-node/node_modules/d3-axis": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz",
-      "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ=="
-    },
-    "node_modules/d3-node/node_modules/d3-brush": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz",
-      "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==",
+    "node_modules/d3-scale-chromatic": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz",
+      "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==",
       "dependencies": {
-        "d3-dispatch": "1",
-        "d3-drag": "1",
-        "d3-interpolate": "1",
-        "d3-selection": "1",
-        "d3-transition": "1"
+        "d3-color": "1 - 3",
+        "d3-interpolate": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/d3-chord": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz",
-      "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==",
-      "dependencies": {
-        "d3-array": "1",
-        "d3-path": "1"
+    "node_modules/d3-selection": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
+      "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/d3-color": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz",
-      "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
-    },
-    "node_modules/d3-node/node_modules/d3-contour": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz",
-      "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==",
+    "node_modules/d3-shape": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz",
+      "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==",
       "dependencies": {
-        "d3-array": "^1.1.1"
+        "d3-path": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/d3-dispatch": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
-      "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
-    },
-    "node_modules/d3-node/node_modules/d3-drag": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz",
-      "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==",
+    "node_modules/d3-time": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz",
+      "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==",
       "dependencies": {
-        "d3-dispatch": "1",
-        "d3-selection": "1"
+        "d3-array": "2 - 3"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/d3-dsv": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz",
-      "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==",
+    "node_modules/d3-time-format": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
+      "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
       "dependencies": {
-        "commander": "2",
-        "iconv-lite": "0.4",
-        "rw": "1"
+        "d3-time": "1 - 3"
       },
-      "bin": {
-        "csv2json": "bin/dsv2json",
-        "csv2tsv": "bin/dsv2dsv",
-        "dsv2dsv": "bin/dsv2dsv",
-        "dsv2json": "bin/dsv2json",
-        "json2csv": "bin/json2dsv",
-        "json2dsv": "bin/json2dsv",
-        "json2tsv": "bin/json2dsv",
-        "tsv2csv": "bin/dsv2dsv",
-        "tsv2json": "bin/dsv2json"
-      }
-    },
-    "node_modules/d3-node/node_modules/d3-ease": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz",
-      "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ=="
-    },
-    "node_modules/d3-node/node_modules/d3-fetch": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz",
-      "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==",
-      "dependencies": {
-        "d3-dsv": "1"
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/d3-force": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz",
-      "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==",
-      "dependencies": {
-        "d3-collection": "1",
-        "d3-dispatch": "1",
-        "d3-quadtree": "1",
-        "d3-timer": "1"
+    "node_modules/d3-timer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
+      "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/d3-format": {
-      "version": "1.4.5",
-      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz",
-      "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ=="
-    },
-    "node_modules/d3-node/node_modules/d3-geo": {
-      "version": "1.12.1",
-      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz",
-      "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==",
+    "node_modules/d3-transition": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
+      "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
       "dependencies": {
-        "d3-array": "1"
+        "d3-color": "1 - 3",
+        "d3-dispatch": "1 - 3",
+        "d3-ease": "1 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-timer": "1 - 3"
+      },
+      "engines": {
+        "node": ">=12"
+      },
+      "peerDependencies": {
+        "d3-selection": "2 - 3"
       }
     },
-    "node_modules/d3-node/node_modules/d3-hierarchy": {
-      "version": "1.1.9",
-      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz",
-      "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ=="
-    },
-    "node_modules/d3-node/node_modules/d3-interpolate": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz",
-      "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==",
+    "node_modules/d3-zoom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
+      "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
       "dependencies": {
-        "d3-color": "1"
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "2 - 3",
+        "d3-transition": "2 - 3"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/d3-node/node_modules/d3-path": {
-      "version": "1.0.9",
-      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
-      "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
-    },
-    "node_modules/d3-node/node_modules/d3-polygon": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz",
-      "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ=="
-    },
-    "node_modules/d3-node/node_modules/d3-quadtree": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
-      "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA=="
-    },
-    "node_modules/d3-node/node_modules/d3-random": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz",
-      "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ=="
-    },
-    "node_modules/d3-node/node_modules/d3-scale": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
-      "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==",
+    "node_modules/dashdash": {
+      "version": "1.14.1",
+      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+      "optional": true,
       "dependencies": {
-        "d3-array": "^1.2.0",
-        "d3-collection": "1",
-        "d3-format": "1",
-        "d3-interpolate": "1",
-        "d3-time": "1",
-        "d3-time-format": "2"
+        "assert-plus": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10"
       }
     },
-    "node_modules/d3-node/node_modules/d3-scale-chromatic": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz",
-      "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==",
-      "dependencies": {
-        "d3-color": "1",
-        "d3-interpolate": "1"
+    "node_modules/data-uri-to-buffer": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
+      "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
+      "engines": {
+        "node": ">= 12"
       }
     },
-    "node_modules/d3-node/node_modules/d3-selection": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz",
-      "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg=="
-    },
-    "node_modules/d3-node/node_modules/d3-shape": {
-      "version": "1.3.7",
-      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
-      "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
+    "node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dependencies": {
-        "d3-path": "1"
+        "ms": "2.0.0"
       }
     },
-    "node_modules/d3-node/node_modules/d3-time": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
-      "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
+    "node_modules/decimal.js": {
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
     },
-    "node_modules/d3-node/node_modules/d3-time-format": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz",
-      "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==",
-      "dependencies": {
-        "d3-time": "1"
+    "node_modules/decode-uri-component": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
+      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
+      "optional": true,
+      "engines": {
+        "node": ">=0.10"
       }
     },
-    "node_modules/d3-node/node_modules/d3-timer": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz",
-      "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
-    },
-    "node_modules/d3-node/node_modules/d3-transition": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz",
-      "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==",
-      "dependencies": {
-        "d3-color": "1",
-        "d3-dispatch": "1",
-        "d3-ease": "1",
-        "d3-interpolate": "1",
-        "d3-selection": "^1.1.0",
-        "d3-timer": "1"
-      }
-    },
-    "node_modules/d3-node/node_modules/d3-zoom": {
-      "version": "1.8.3",
-      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz",
-      "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==",
-      "dependencies": {
-        "d3-dispatch": "1",
-        "d3-drag": "1",
-        "d3-interpolate": "1",
-        "d3-selection": "1",
-        "d3-transition": "1"
-      }
-    },
-    "node_modules/d3-node/node_modules/escodegen": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
-      "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+    "node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
       "dependencies": {
-        "esprima": "^4.0.1",
-        "estraverse": "^5.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1"
-      },
-      "bin": {
-        "escodegen": "bin/escodegen.js",
-        "esgenerate": "bin/esgenerate.js"
+        "mimic-response": "^3.1.0"
       },
       "engines": {
-        "node": ">=6.0"
+        "node": ">=10"
       },
-      "optionalDependencies": {
-        "source-map": "~0.6.1"
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/d3-node/node_modules/form-data": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-      "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-      "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "mime-types": "^2.1.12"
+    "node_modules/decompress-response/node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "engines": {
+        "node": ">=10"
       },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/dedent": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
+      "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
+      "dev": true
+    },
+    "node_modules/deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
       "engines": {
-        "node": ">= 6"
+        "node": ">=4.0.0"
       }
     },
-    "node_modules/d3-node/node_modules/html-encoding-sniffer": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
-      "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
-      "dependencies": {
-        "whatwg-encoding": "^1.0.5"
-      },
+    "node_modules/deep-is": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+    },
+    "node_modules/deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
       "engines": {
-        "node": ">=10"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/d3-node/node_modules/jsdom": {
-      "version": "16.7.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
-      "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
-      "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"
-      },
+    "node_modules/defer-to-connect": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+      "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
       "engines": {
         "node": ">=10"
-      },
-      "peerDependencies": {
-        "canvas": "^2.5.0"
-      },
-      "peerDependenciesMeta": {
-        "canvas": {
-          "optional": true
-        }
       }
     },
-    "node_modules/d3-node/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+    "node_modules/delaunator": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz",
+      "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==",
       "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
+        "robust-predicates": "^3.0.0"
       }
     },
-    "node_modules/d3-node/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
       "engines": {
-        "node": ">= 0.8.0"
+        "node": ">=0.4.0"
       }
     },
-    "node_modules/d3-node/node_modules/parse5": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
-      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+    "node_modules/delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
     },
-    "node_modules/d3-node/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+    "node_modules/delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+      "devOptional": true
+    },
+    "node_modules/depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
       "engines": {
-        "node": ">= 0.8.0"
+        "node": ">= 0.8"
       }
     },
-    "node_modules/d3-node/node_modules/tough-cookie": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
-      "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
-      "dependencies": {
-        "psl": "^1.1.33",
-        "punycode": "^2.1.1",
-        "universalify": "^0.2.0",
-        "url-parse": "^1.5.3"
-      },
+    "node_modules/deprecation": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+      "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
+    },
+    "node_modules/destroy": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
       "engines": {
-        "node": ">=6"
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
       }
     },
-    "node_modules/d3-node/node_modules/tr46": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
-      "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
-      "dependencies": {
-        "punycode": "^2.1.1"
-      },
+    "node_modules/detect-libc": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
+      "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/d3-node/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
+    "node_modules/detect-newline": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+      "dev": true,
       "engines": {
-        "node": ">= 0.8.0"
+        "node": ">=8"
       }
     },
-    "node_modules/d3-node/node_modules/webidl-conversions": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-      "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+    "node_modules/devtools-protocol": {
+      "version": "0.0.1068969",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1068969.tgz",
+      "integrity": "sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ=="
+    },
+    "node_modules/diff-sequences": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz",
+      "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==",
+      "dev": true,
       "engines": {
-        "node": ">=10.4"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/d3-node/node_modules/whatwg-url": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
-      "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+    "node_modules/doctrine": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+      "dev": true,
       "dependencies": {
-        "lodash": "^4.7.0",
-        "tr46": "^2.1.0",
-        "webidl-conversions": "^6.1.0"
+        "esutils": "^2.0.2"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=6.0.0"
       }
     },
-    "node_modules/d3-node/node_modules/ws": {
-      "version": "7.5.9",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
-      "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
-      "engines": {
-        "node": ">=8.3.0"
-      },
-      "peerDependencies": {
-        "bufferutil": "^4.0.1",
-        "utf-8-validate": "^5.0.2"
+    "node_modules/dom-serializer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "entities": "^4.2.0"
       },
-      "peerDependenciesMeta": {
-        "bufferutil": {
-          "optional": true
-        },
-        "utf-8-validate": {
-          "optional": true
-        }
+      "funding": {
+        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
       }
     },
-    "node_modules/d3-node/node_modules/xml-name-validator": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
-      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
-    },
-    "node_modules/d3-path": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz",
-      "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==",
+    "node_modules/dom-serializer/node_modules/entities": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
       "engines": {
-        "node": ">=12"
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
-    "node_modules/d3-polygon": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
-      "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==",
-      "engines": {
-        "node": ">=12"
-      }
+    "node_modules/domelementtype": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ]
     },
-    "node_modules/d3-quadtree": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
-      "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==",
+    "node_modules/domhandler": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+      "dependencies": {
+        "domelementtype": "^2.3.0"
+      },
       "engines": {
-        "node": ">=12"
+        "node": ">= 4"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domhandler?sponsor=1"
       }
     },
-    "node_modules/d3-random": {
+    "node_modules/domutils": {
       "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
-      "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==",
-      "engines": {
-        "node": ">=12"
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
+      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
+      "dependencies": {
+        "dom-serializer": "^2.0.0",
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/domutils?sponsor=1"
       }
     },
-    "node_modules/d3-scale": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
-      "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
+    "node_modules/duplexer2": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+      "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+      "optional": true,
       "dependencies": {
-        "d3-array": "2.10.0 - 3",
-        "d3-format": "1 - 3",
-        "d3-interpolate": "1.2.0 - 3",
-        "d3-time": "2.1.1 - 3",
-        "d3-time-format": "2 - 4"
-      },
-      "engines": {
-        "node": ">=12"
+        "readable-stream": "^2.0.2"
       }
     },
-    "node_modules/d3-scale-chromatic": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz",
-      "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==",
+    "node_modules/ecc-jsbn": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
+      "optional": true,
       "dependencies": {
-        "d3-color": "1 - 3",
-        "d3-interpolate": "1 - 3"
+        "jsbn": "~0.1.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+    },
+    "node_modules/ejs": {
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
+      "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
+      "dependencies": {
+        "jake": "^10.8.5"
+      },
+      "bin": {
+        "ejs": "bin/cli.js"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/d3-selection": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
-      "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==",
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.284",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
+      "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+      "dev": true
+    },
+    "node_modules/emittery": {
+      "version": "0.13.1",
+      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+      "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+      "dev": true,
       "engines": {
         "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/emittery?sponsor=1"
       }
     },
-    "node_modules/d3-shape": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz",
-      "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==",
+    "node_modules/emoji-name-map": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/emoji-name-map/-/emoji-name-map-1.2.9.tgz",
+      "integrity": "sha512-MSM8y6koSqh/2uEMI2VoKA+Ac0qL5RkgFGP/pzL6n5FOrOJ7FOZFxgs7+uNpqA+AT+WmdbMPXkd3HnFXXdz4AA==",
       "dependencies": {
-        "d3-path": "1 - 3"
-      },
-      "engines": {
-        "node": ">=12"
+        "emojilib": "^2.0.2",
+        "iterate-object": "^1.3.1",
+        "map-o": "^2.0.1"
       }
     },
-    "node_modules/d3-time": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz",
-      "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==",
-      "dependencies": {
-        "d3-array": "2 - 3"
-      },
+    "node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "devOptional": true
+    },
+    "node_modules/emojilib": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz",
+      "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw=="
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
       "engines": {
-        "node": ">=12"
+        "node": ">= 0.8"
       }
     },
-    "node_modules/d3-time-format": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
-      "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
+    "node_modules/end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
       "dependencies": {
-        "d3-time": "1 - 3"
-      },
-      "engines": {
-        "node": ">=12"
+        "once": "^1.4.0"
       }
     },
-    "node_modules/d3-timer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
-      "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==",
-      "engines": {
-        "node": ">=12"
+    "node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
-    "node_modules/d3-transition": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
-      "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
+    "node_modules/error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
       "dependencies": {
-        "d3-color": "1 - 3",
-        "d3-dispatch": "1 - 3",
-        "d3-ease": "1 - 3",
-        "d3-interpolate": "1 - 3",
-        "d3-timer": "1 - 3"
-      },
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "dev": true,
       "engines": {
-        "node": ">=12"
-      },
-      "peerDependencies": {
-        "d3-selection": "2 - 3"
+        "node": ">=6"
       }
     },
-    "node_modules/d3-voronoi": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz",
-      "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg=="
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
     },
-    "node_modules/d3-zoom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
-      "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
-      "dependencies": {
-        "d3-dispatch": "1 - 3",
-        "d3-drag": "2 - 3",
-        "d3-interpolate": "1 - 3",
-        "d3-selection": "2 - 3",
-        "d3-transition": "2 - 3"
-      },
+    "node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
       "engines": {
-        "node": ">=12"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
+    "node_modules/escodegen": {
+      "version": "1.14.3",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
       "optional": true,
       "dependencies": {
-        "assert-plus": "^1.0.0"
+        "esprima": "^4.0.1",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1"
+      },
+      "bin": {
+        "escodegen": "bin/escodegen.js",
+        "esgenerate": "bin/esgenerate.js"
       },
       "engines": {
-        "node": ">=0.10"
+        "node": ">=4.0"
+      },
+      "optionalDependencies": {
+        "source-map": "~0.6.1"
       }
     },
-    "node_modules/data-uri-to-buffer": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
-      "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
+    "node_modules/escodegen/node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "optional": true,
       "engines": {
-        "node": ">= 12"
+        "node": ">=4.0"
       }
     },
-    "node_modules/data-urls": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
-      "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
+    "node_modules/escodegen/node_modules/levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+      "optional": true,
       "dependencies": {
-        "abab": "^2.0.3",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.0.0"
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/data-urls/node_modules/abab": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
-      "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
-    },
-    "node_modules/data-urls/node_modules/tr46": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
-      "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+    "node_modules/escodegen/node_modules/optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+      "optional": true,
       "dependencies": {
-        "punycode": "^2.1.1"
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/data-urls/node_modules/webidl-conversions": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-      "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+    "node_modules/escodegen/node_modules/prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+      "optional": true,
       "engines": {
-        "node": ">=10.4"
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/data-urls/node_modules/whatwg-url": {
-      "version": "8.7.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
-      "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+    "node_modules/escodegen/node_modules/type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+      "optional": true,
       "dependencies": {
-        "lodash": "^4.7.0",
-        "tr46": "^2.1.0",
-        "webidl-conversions": "^6.1.0"
+        "prelude-ls": "~1.1.2"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+    "node_modules/eslint": {
+      "version": "8.32.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz",
+      "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==",
+      "dev": true,
       "dependencies": {
-        "ms": "2.0.0"
+        "@eslint/eslintrc": "^1.4.1",
+        "@humanwhocodes/config-array": "^0.11.8",
+        "@humanwhocodes/module-importer": "^1.0.1",
+        "@nodelib/fs.walk": "^1.2.8",
+        "ajv": "^6.10.0",
+        "chalk": "^4.0.0",
+        "cross-spawn": "^7.0.2",
+        "debug": "^4.3.2",
+        "doctrine": "^3.0.0",
+        "escape-string-regexp": "^4.0.0",
+        "eslint-scope": "^7.1.1",
+        "eslint-utils": "^3.0.0",
+        "eslint-visitor-keys": "^3.3.0",
+        "espree": "^9.4.0",
+        "esquery": "^1.4.0",
+        "esutils": "^2.0.2",
+        "fast-deep-equal": "^3.1.3",
+        "file-entry-cache": "^6.0.1",
+        "find-up": "^5.0.0",
+        "glob-parent": "^6.0.2",
+        "globals": "^13.19.0",
+        "grapheme-splitter": "^1.0.4",
+        "ignore": "^5.2.0",
+        "import-fresh": "^3.0.0",
+        "imurmurhash": "^0.1.4",
+        "is-glob": "^4.0.0",
+        "is-path-inside": "^3.0.3",
+        "js-sdsl": "^4.1.4",
+        "js-yaml": "^4.1.0",
+        "json-stable-stringify-without-jsonify": "^1.0.1",
+        "levn": "^0.4.1",
+        "lodash.merge": "^4.6.2",
+        "minimatch": "^3.1.2",
+        "natural-compare": "^1.4.0",
+        "optionator": "^0.9.1",
+        "regexpp": "^3.2.0",
+        "strip-ansi": "^6.0.1",
+        "strip-json-comments": "^3.1.0",
+        "text-table": "^0.2.0"
+      },
+      "bin": {
+        "eslint": "bin/eslint.js"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/decimal.js": {
-      "version": "10.4.1",
-      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.1.tgz",
-      "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw=="
-    },
-    "node_modules/decode-uri-component": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
-      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
-      "optional": true,
+    "node_modules/eslint-scope": {
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+      "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+      "dev": true,
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^5.2.0"
+      },
       "engines": {
-        "node": ">=0.10"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
-    "node_modules/decompress-response": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
-      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+    "node_modules/eslint-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+      "dev": true,
       "dependencies": {
-        "mimic-response": "^3.1.0"
+        "eslint-visitor-keys": "^2.0.0"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
       },
       "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "url": "https://github.com/sponsors/mysticatea"
+      },
+      "peerDependencies": {
+        "eslint": ">=5"
       }
     },
-    "node_modules/decompress-response/node_modules/mimic-response": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
-      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+      "dev": true,
       "engines": {
         "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/dedent": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
-      "dev": true
-    },
-    "node_modules/deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+    "node_modules/eslint-visitor-keys": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+      "dev": true,
       "engines": {
-        "node": ">=4.0.0"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
-    "node_modules/deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
-    },
-    "node_modules/deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
-      "engines": {
-        "node": ">=0.10.0"
+    "node_modules/eslint/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dev": true,
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "node_modules/defer-to-connect": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
-      "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+    "node_modules/eslint/node_modules/debug": {
+      "version": "4.3.2",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
       "engines": {
-        "node": ">=10"
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "node_modules/delaunator": {
+    "node_modules/eslint/node_modules/find-up": {
       "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz",
-      "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+      "dev": true,
       "dependencies": {
-        "robust-predicates": "^3.0.0"
+        "locate-path": "^6.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+    "node_modules/eslint/node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
       "engines": {
-        "node": ">=0.4.0"
+        "node": ">=10.13.0"
       }
     },
-    "node_modules/delegate": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
-      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
-    },
-    "node_modules/delegates": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
-      "devOptional": true
-    },
-    "node_modules/depd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
-      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+    "node_modules/eslint/node_modules/locate-path": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^5.0.0"
+      },
       "engines": {
-        "node": ">= 0.8"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/deprecation": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
-      "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
-    },
-    "node_modules/destroy": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
-      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+    "node_modules/eslint/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dev": true,
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
       "engines": {
-        "node": ">= 0.8",
-        "npm": "1.2.8000 || >= 1.4.16"
+        "node": "*"
       }
     },
-    "node_modules/detect-libc": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
-      "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
+    "node_modules/eslint/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
+    "node_modules/eslint/node_modules/p-locate": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^3.0.2"
+      },
       "engines": {
-        "node": ">=8"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/detect-newline": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
-      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+    "node_modules/espree": {
+      "version": "9.4.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
+      "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
       "dev": true,
+      "dependencies": {
+        "acorn": "^8.8.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.3.0"
+      },
       "engines": {
-        "node": ">=8"
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
-    "node_modules/devtools-protocol": {
-      "version": "0.0.1068969",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1068969.tgz",
-      "integrity": "sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ=="
-    },
-    "node_modules/diff-sequences": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz",
-      "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==",
-      "dev": true,
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=4"
       }
     },
-    "node_modules/doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+    "node_modules/esquery": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
       "dev": true,
       "dependencies": {
-        "esutils": "^2.0.2"
+        "estraverse": "^5.1.0"
       },
       "engines": {
-        "node": ">=6.0.0"
+        "node": ">=0.10"
       }
     },
-    "node_modules/dom-serializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dev": true,
       "dependencies": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
-        "entities": "^4.2.0"
+        "estraverse": "^5.2.0"
       },
-      "funding": {
-        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+      "engines": {
+        "node": ">=4.0"
       }
     },
-    "node_modules/dom-serializer/node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+    "node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
       "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
+        "node": ">=4.0"
       }
     },
-    "node_modules/domelementtype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
-      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fb55"
-        }
-      ]
-    },
-    "node_modules/domexception": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
-      "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
-      "dependencies": {
-        "webidl-conversions": "^5.0.0"
-      },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
       "engines": {
-        "node": ">=8"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/domexception/node_modules/webidl-conversions": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
-      "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
       "engines": {
-        "node": ">=8"
+        "node": ">= 0.6"
       }
     },
-    "node_modules/domhandler": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+    "node_modules/execa": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+      "dev": true,
       "dependencies": {
-        "domelementtype": "^2.3.0"
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
       },
       "engines": {
-        "node": ">= 4"
+        "node": ">=10"
       },
       "funding": {
-        "url": "https://github.com/fb55/domhandler?sponsor=1"
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
-    "node_modules/domutils": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
-      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
-      "dependencies": {
-        "dom-serializer": "^2.0.0",
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.1"
+    "node_modules/execa/node_modules/get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
       },
       "funding": {
-        "url": "https://github.com/fb55/domutils?sponsor=1"
-      }
-    },
-    "node_modules/duplexer2": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
-      "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
-      "optional": true,
-      "dependencies": {
-        "readable-stream": "^2.0.2"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/ecc-jsbn": {
+    "node_modules/exit": {
       "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
-      "optional": true,
-      "dependencies": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
+      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+      "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
-    },
-    "node_modules/ejs": {
-      "version": "3.1.8",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
-      "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
-      "dependencies": {
-        "jake": "^10.8.5"
-      },
-      "bin": {
-        "ejs": "bin/cli.js"
-      },
+    "node_modules/expand-template": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+      "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=6"
       }
     },
-    "node_modules/electron-to-chromium": {
-      "version": "1.4.284",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
-      "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
-      "dev": true
-    },
-    "node_modules/emittery": {
-      "version": "0.13.1",
-      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
-      "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+    "node_modules/expect": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz",
+      "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==",
       "dev": true,
-      "engines": {
-        "node": ">=12"
+      "dependencies": {
+        "@jest/expect-utils": "^29.3.1",
+        "jest-get-type": "^29.2.0",
+        "jest-matcher-utils": "^29.3.1",
+        "jest-message-util": "^29.3.1",
+        "jest-util": "^29.3.1"
       },
-      "funding": {
-        "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/emoji-name-map": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/emoji-name-map/-/emoji-name-map-1.2.9.tgz",
-      "integrity": "sha512-MSM8y6koSqh/2uEMI2VoKA+Ac0qL5RkgFGP/pzL6n5FOrOJ7FOZFxgs7+uNpqA+AT+WmdbMPXkd3HnFXXdz4AA==",
+    "node_modules/express": {
+      "version": "4.18.2",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
+      "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
       "dependencies": {
-        "emojilib": "^2.0.2",
-        "iterate-object": "^1.3.1",
-        "map-o": "^2.0.1"
-      }
-    },
-    "node_modules/emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "devOptional": true
-    },
-    "node_modules/emojilib": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz",
-      "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw=="
-    },
-    "node_modules/encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+        "accepts": "~1.3.8",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.20.1",
+        "content-disposition": "0.5.4",
+        "content-type": "~1.0.4",
+        "cookie": "0.5.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "1.2.0",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.7",
+        "qs": "6.11.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.2.1",
+        "send": "0.18.0",
+        "serve-static": "1.15.0",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
       "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "dependencies": {
-        "once": "^1.4.0"
-      }
-    },
-    "node_modules/entities": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
-    "node_modules/error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "dependencies": {
-        "is-arrayish": "^0.2.1"
+        "node": ">= 0.10.0"
       }
     },
-    "node_modules/escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-      "dev": true,
+    "node_modules/express-rate-limit": {
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz",
+      "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==",
       "engines": {
-        "node": ">=6"
+        "node": ">= 12.9.0"
+      },
+      "peerDependencies": {
+        "express": "^4 || ^5"
       }
     },
-    "node_modules/escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+    "node_modules/express/node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
     },
-    "node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
+    "node_modules/extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "optional": true
     },
-    "node_modules/escodegen": {
-      "version": "1.14.3",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
-      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
-      "optional": true,
+    "node_modules/extract-zip": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+      "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
       "dependencies": {
-        "esprima": "^4.0.1",
-        "estraverse": "^4.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1"
+        "debug": "^4.1.1",
+        "get-stream": "^5.1.0",
+        "yauzl": "^2.10.0"
       },
       "bin": {
-        "escodegen": "bin/escodegen.js",
-        "esgenerate": "bin/esgenerate.js"
+        "extract-zip": "cli.js"
       },
       "engines": {
-        "node": ">=4.0"
+        "node": ">= 10.17.0"
       },
       "optionalDependencies": {
-        "source-map": "~0.6.1"
-      }
-    },
-    "node_modules/escodegen/node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "optional": true,
-      "engines": {
-        "node": ">=4.0"
+        "@types/yauzl": "^2.9.1"
       }
     },
-    "node_modules/escodegen/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-      "optional": true,
+    "node_modules/extract-zip/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
+        "ms": "2.1.2"
       },
       "engines": {
-        "node": ">= 0.8.0"
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "node_modules/escodegen/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+    "node_modules/extract-zip/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/extsprintf": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
+      "engines": [
+        "node >=0.6.0"
+      ],
+      "optional": true
+    },
+    "node_modules/falafel": {
+      "version": "2.2.5",
+      "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz",
+      "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==",
       "optional": true,
       "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
+        "acorn": "^7.1.1",
+        "isarray": "^2.0.1"
       },
       "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
-      "optional": true,
-      "engines": {
-        "node": ">= 0.8.0"
+        "node": ">=0.4.0"
       }
     },
-    "node_modules/escodegen/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+    "node_modules/falafel/node_modules/acorn": {
+      "version": "7.4.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
       "optional": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
+      "bin": {
+        "acorn": "bin/acorn"
       },
       "engines": {
-        "node": ">= 0.8.0"
+        "node": ">=0.4.0"
       }
     },
-    "node_modules/eslint": {
-      "version": "8.32.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz",
-      "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==",
-      "dev": true,
-      "dependencies": {
-        "@eslint/eslintrc": "^1.4.1",
-        "@humanwhocodes/config-array": "^0.11.8",
-        "@humanwhocodes/module-importer": "^1.0.1",
-        "@nodelib/fs.walk": "^1.2.8",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.3.2",
-        "doctrine": "^3.0.0",
-        "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.1.1",
-        "eslint-utils": "^3.0.0",
-        "eslint-visitor-keys": "^3.3.0",
-        "espree": "^9.4.0",
-        "esquery": "^1.4.0",
-        "esutils": "^2.0.2",
-        "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^6.0.1",
-        "find-up": "^5.0.0",
-        "glob-parent": "^6.0.2",
-        "globals": "^13.19.0",
-        "grapheme-splitter": "^1.0.4",
-        "ignore": "^5.2.0",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "is-path-inside": "^3.0.3",
-        "js-sdsl": "^4.1.4",
-        "js-yaml": "^4.1.0",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash.merge": "^4.6.2",
-        "minimatch": "^3.1.2",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "regexpp": "^3.2.0",
-        "strip-ansi": "^6.0.1",
-        "strip-json-comments": "^3.1.0",
-        "text-table": "^0.2.0"
-      },
-      "bin": {
-        "eslint": "bin/eslint.js"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
-      }
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "devOptional": true
     },
-    "node_modules/eslint-scope": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
-      "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "devOptional": true
+    },
+    "node_modules/fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+    },
+    "node_modules/fastq": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
       "dev": true,
       "dependencies": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^5.2.0"
-      },
-      "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "reusify": "^1.0.4"
       }
     },
-    "node_modules/eslint-utils": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
-      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+    "node_modules/fb-watchman": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+      "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
       "dev": true,
       "dependencies": {
-        "eslint-visitor-keys": "^2.0.0"
+        "bser": "2.1.1"
+      }
+    },
+    "node_modules/fd-slicer": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+      "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+      "dependencies": {
+        "pend": "~1.2.0"
+      }
+    },
+    "node_modules/fetch-blob": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.4.tgz",
+      "integrity": "sha512-Eq5Xv5+VlSrYWEqKrusxY1C3Hm/hjeAsCGVG3ft7pZahlUAChpGZT/Ms1WmSLnEAisEXszjzu/s+ce6HZB2VHA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "dependencies": {
+        "node-domexception": "^1.0.0",
+        "web-streams-polyfill": "^3.0.3"
       },
       "engines": {
-        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      },
-      "peerDependencies": {
-        "eslint": ">=5"
+        "node": "^12.20 || >= 14.13"
       }
     },
-    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+    "node_modules/file-entry-cache": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
       "dev": true,
+      "dependencies": {
+        "flat-cache": "^3.0.4"
+      },
       "engines": {
-        "node": ">=10"
+        "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "node_modules/eslint-visitor-keys": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
-      "dev": true,
+    "node_modules/file-type": {
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.0.tgz",
+      "integrity": "sha512-M3RQMWY3F2ykyWZ+IHwNCjpnUmukYhtdkGGC1ZVEUb0ve5REGF7NNJ4Q9ehCUabtQKtSVFOMbFTXgJlFb0DQIg==",
+      "dependencies": {
+        "readable-web-to-node-stream": "^3.0.2",
+        "strtok3": "^7.0.0",
+        "token-types": "^5.0.1"
+      },
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/file-type?sponsor=1"
       }
     },
-    "node_modules/eslint/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
+    "node_modules/file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "dev": true
+    },
+    "node_modules/filelist": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz",
+      "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==",
       "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+        "minimatch": "^5.0.1"
       }
     },
-    "node_modules/eslint/node_modules/debug": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-      "dev": true,
+    "node_modules/filelist/node_modules/minimatch": {
+      "version": "5.1.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
+      "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
       "dependencies": {
-        "ms": "2.1.2"
+        "brace-expansion": "^2.0.1"
       },
       "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
+        "node": ">=10"
       }
     },
-    "node_modules/eslint/node_modules/find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+    "node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
       "dev": true,
       "dependencies": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
+        "to-regex-range": "^5.0.1"
       },
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=8"
       }
     },
-    "node_modules/eslint/node_modules/glob-parent": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
-      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
-      "dev": true,
+    "node_modules/filter-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
+      "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
+      "optional": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
       "dependencies": {
-        "is-glob": "^4.0.3"
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "statuses": "2.0.1",
+        "unpipe": "~1.0.0"
       },
       "engines": {
-        "node": ">=10.13.0"
+        "node": ">= 0.8"
       }
     },
-    "node_modules/eslint/node_modules/locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+    "node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
       "dev": true,
       "dependencies": {
-        "p-locate": "^5.0.0"
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
       },
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=8"
       }
     },
-    "node_modules/eslint/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+    "node_modules/flat-cache": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
       "dev": true,
       "dependencies": {
-        "brace-expansion": "^1.1.7"
+        "flatted": "^3.1.0",
+        "rimraf": "^3.0.2"
       },
       "engines": {
-        "node": "*"
+        "node": "^10.12.0 || >=12.0.0"
       }
     },
-    "node_modules/eslint/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+    "node_modules/flatted": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+      "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
       "dev": true
     },
-    "node_modules/eslint/node_modules/p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^3.0.2"
-      },
+    "node_modules/follow-redirects": {
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
       "engines": {
-        "node": ">=10"
+        "node": ">=4.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
       }
     },
-    "node_modules/espree": {
-      "version": "9.4.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
-      "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^8.8.0",
-        "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.3.0"
-      },
+    "node_modules/forever-agent": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
+      "optional": true,
       "engines": {
-        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://opencollective.com/eslint"
+        "node": "*"
       }
     },
-    "node_modules/esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
       },
       "engines": {
-        "node": ">=4"
+        "node": ">= 6"
       }
     },
-    "node_modules/esquery": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
-      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
-      "dev": true,
-      "dependencies": {
-        "estraverse": "^5.1.0"
-      },
+    "node_modules/form-data-encoder": {
+      "version": "2.1.4",
+      "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
+      "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
       "engines": {
-        "node": ">=0.10"
+        "node": ">= 14.17"
       }
     },
-    "node_modules/esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "dev": true,
+    "node_modules/formdata-polyfill": {
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
+      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
       "dependencies": {
-        "estraverse": "^5.2.0"
+        "fetch-blob": "^3.1.2"
       },
       "engines": {
-        "node": ">=4.0"
+        "node": ">=12.20.0"
       }
     },
-    "node_modules/estraverse": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+    "node_modules/forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
       "engines": {
-        "node": ">=4.0"
+        "node": ">= 0.6"
       }
     },
-    "node_modules/esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 0.6"
       }
     },
-    "node_modules/etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+    "node_modules/fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+    },
+    "node_modules/fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "devOptional": true,
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
       "engines": {
-        "node": ">= 0.6"
+        "node": ">= 8"
       }
     },
-    "node_modules/execa": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
       "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "node_modules/gauge": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+      "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+      "devOptional": true,
       "dependencies": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
+        "aproba": "^1.0.3 || ^2.0.0",
+        "color-support": "^1.1.2",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.1",
+        "object-assign": "^4.1.1",
+        "signal-exit": "^3.0.0",
+        "string-width": "^4.2.3",
+        "strip-ansi": "^6.0.1",
+        "wide-align": "^1.1.2"
       },
       "engines": {
         "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
-    "node_modules/execa/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
       "dev": true,
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=6.9.0"
       }
     },
-    "node_modules/exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
       "dev": true,
       "engines": {
-        "node": ">= 0.8.0"
+        "node": "6.* || 8.* || >= 10.*"
       }
     },
-    "node_modules/expand-template": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
-      "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
-      "engines": {
-        "node": ">=6"
+    "node_modules/get-intrinsic": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
+      "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/expect": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz",
-      "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==",
+    "node_modules/get-package-type": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
       "dev": true,
-      "dependencies": {
-        "@jest/expect-utils": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "jest-matcher-utils": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-util": "^29.3.1"
-      },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=8.0.0"
       }
     },
-    "node_modules/express": {
-      "version": "4.18.2",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
-      "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+    "node_modules/get-stream": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
       "dependencies": {
-        "accepts": "~1.3.8",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.20.1",
-        "content-disposition": "0.5.4",
-        "content-type": "~1.0.4",
-        "cookie": "0.5.0",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "1.2.0",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "merge-descriptors": "1.0.1",
-        "methods": "~1.1.2",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.7",
-        "qs": "6.11.0",
-        "range-parser": "~1.2.1",
-        "safe-buffer": "5.2.1",
-        "send": "0.18.0",
-        "serve-static": "1.15.0",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "type-is": "~1.6.18",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
+        "pump": "^3.0.0"
       },
       "engines": {
-        "node": ">= 0.10.0"
-      }
-    },
-    "node_modules/express-rate-limit": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz",
-      "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==",
-      "engines": {
-        "node": ">= 12.9.0"
+        "node": ">=8"
       },
-      "peerDependencies": {
-        "express": "^4 || ^5"
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/express/node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "optional": true
-    },
-    "node_modules/extract-zip": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
-      "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+    "node_modules/getpass": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
+      "optional": true,
       "dependencies": {
-        "debug": "^4.1.1",
-        "get-stream": "^5.1.0",
-        "yauzl": "^2.10.0"
-      },
-      "bin": {
-        "extract-zip": "cli.js"
-      },
-      "engines": {
-        "node": ">= 10.17.0"
-      },
-      "optionalDependencies": {
-        "@types/yauzl": "^2.9.1"
+        "assert-plus": "^1.0.0"
       }
     },
-    "node_modules/extract-zip/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+    "node_modules/gifencoder": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz",
+      "integrity": "sha512-x19DcyWY10SkshBpokqFOo/HBht9GB75evRYvaLMbez9p+yB/o+kt0fK9AwW59nFiAMs2UUQsjv1lX/hvu9Ong==",
+      "optional": true,
       "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
+        "canvas": "^2.2.0"
       }
     },
-    "node_modules/extract-zip/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
-    "node_modules/extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
-      "engines": [
-        "node >=0.6.0"
-      ],
-      "optional": true
+    "node_modules/github-from-package": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+      "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
     },
-    "node_modules/falafel": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz",
-      "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==",
-      "optional": true,
+    "node_modules/glob": {
+      "version": "7.1.7",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
       "dependencies": {
-        "acorn": "^7.1.1",
-        "isarray": "^2.0.1"
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
       },
       "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/falafel/node_modules/acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "optional": true,
-      "bin": {
-        "acorn": "bin/acorn"
+        "node": "*"
       },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "devOptional": true
-    },
-    "node_modules/fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "devOptional": true
-    },
-    "node_modules/fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
-    },
-    "node_modules/fastq": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
-      "dev": true,
-      "dependencies": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "node_modules/fb-watchman": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
-      "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
-      "dev": true,
-      "dependencies": {
-        "bser": "2.1.1"
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/fd-slicer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+    "node_modules/glob/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
       "dependencies": {
-        "pend": "~1.2.0"
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "node_modules/fetch-blob": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.4.tgz",
-      "integrity": "sha512-Eq5Xv5+VlSrYWEqKrusxY1C3Hm/hjeAsCGVG3ft7pZahlUAChpGZT/Ms1WmSLnEAisEXszjzu/s+ce6HZB2VHA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/jimmywarting"
-        },
-        {
-          "type": "paypal",
-          "url": "https://paypal.me/jimmywarting"
-        }
-      ],
+    "node_modules/glob/node_modules/minimatch": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.1.tgz",
+      "integrity": "sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==",
       "dependencies": {
-        "node-domexception": "^1.0.0",
-        "web-streams-polyfill": "^3.0.3"
+        "brace-expansion": "^1.1.7"
       },
       "engines": {
-        "node": "^12.20 || >= 14.13"
+        "node": "*"
       }
     },
-    "node_modules/file-entry-cache": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+    "node_modules/globals": {
+      "version": "13.19.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
+      "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
       "dev": true,
       "dependencies": {
-        "flat-cache": "^3.0.4"
-      },
-      "engines": {
-        "node": "^10.12.0 || >=12.0.0"
-      }
-    },
-    "node_modules/file-type": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.0.tgz",
-      "integrity": "sha512-M3RQMWY3F2ykyWZ+IHwNCjpnUmukYhtdkGGC1ZVEUb0ve5REGF7NNJ4Q9ehCUabtQKtSVFOMbFTXgJlFb0DQIg==",
-      "dependencies": {
-        "readable-web-to-node-stream": "^3.0.2",
-        "strtok3": "^7.0.0",
-        "token-types": "^5.0.1"
+        "type-fest": "^0.20.2"
       },
       "engines": {
-        "node": ">=14.16"
+        "node": ">=8"
       },
       "funding": {
-        "url": "https://github.com/sindresorhus/file-type?sponsor=1"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/file-uri-to-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
-      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
-      "dev": true
-    },
-    "node_modules/filelist": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz",
-      "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==",
+    "node_modules/good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
       "dependencies": {
-        "minimatch": "^5.0.1"
+        "delegate": "^3.1.2"
       }
     },
-    "node_modules/filelist/node_modules/minimatch": {
-      "version": "5.1.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
-      "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
+    "node_modules/got": {
+      "version": "12.5.3",
+      "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz",
+      "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==",
       "dependencies": {
-        "brace-expansion": "^2.0.1"
+        "@sindresorhus/is": "^5.2.0",
+        "@szmarczak/http-timer": "^5.0.1",
+        "cacheable-lookup": "^7.0.0",
+        "cacheable-request": "^10.2.1",
+        "decompress-response": "^6.0.0",
+        "form-data-encoder": "^2.1.2",
+        "get-stream": "^6.0.1",
+        "http2-wrapper": "^2.1.10",
+        "lowercase-keys": "^3.0.0",
+        "p-cancelable": "^3.0.0",
+        "responselike": "^3.0.0"
       },
+      "engines": {
+        "node": ">=14.16"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/got?sponsor=1"
+      }
+    },
+    "node_modules/got/node_modules/get-stream": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
       "engines": {
         "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "dev": true,
+    "node_modules/graceful-fs": {
+      "version": "4.2.10",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
+      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
+      "dev": true
+    },
+    "node_modules/grapheme-splitter": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+      "dev": true
+    },
+    "node_modules/har-schema": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+      "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
+      "optional": true,
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/har-validator": {
+      "version": "5.1.5",
+      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+      "deprecated": "this library is no longer supported",
+      "optional": true,
       "dependencies": {
-        "to-regex-range": "^5.0.1"
+        "ajv": "^6.12.3",
+        "har-schema": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dependencies": {
+        "function-bind": "^1.1.1"
       },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/filter-obj": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
-      "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
-      "optional": true,
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/finalhandler": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
-      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+    "node_modules/has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+      "devOptional": true
+    },
+    "node_modules/html-encoding-sniffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+      "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
       "dependencies": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "statuses": "2.0.1",
-        "unpipe": "~1.0.0"
+        "whatwg-encoding": "^2.0.0"
       },
       "engines": {
-        "node": ">= 0.8"
+        "node": ">=12"
       }
     },
-    "node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
+    "node_modules/html-encoding-sniffer/node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
       "dependencies": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/flat-cache": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
-      "dev": true,
+    "node_modules/html-encoding-sniffer/node_modules/whatwg-encoding": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+      "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
       "dependencies": {
-        "flatted": "^3.1.0",
-        "rimraf": "^3.0.2"
+        "iconv-lite": "0.6.3"
       },
       "engines": {
-        "node": "^10.12.0 || >=12.0.0"
+        "node": ">=12"
       }
     },
-    "node_modules/flatted": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
-      "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
+    "node_modules/html-escaper": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
       "dev": true
     },
-    "node_modules/follow-redirects": {
-      "version": "1.15.2",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
-      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
+    "node_modules/htmlparser2": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
+      "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
       "funding": [
+        "https://github.com/fb55/htmlparser2?sponsor=1",
         {
-          "type": "individual",
-          "url": "https://github.com/sponsors/RubenVerborgh"
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
         }
       ],
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependenciesMeta": {
-        "debug": {
-          "optional": true
-        }
+      "dependencies": {
+        "domelementtype": "^2.3.0",
+        "domhandler": "^5.0.2",
+        "domutils": "^3.0.1",
+        "entities": "^4.3.0"
       }
     },
-    "node_modules/forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
-      "optional": true,
+    "node_modules/htmlparser2/node_modules/entities": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
       "engines": {
-        "node": "*"
+        "node": ">=0.12"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
       }
     },
-    "node_modules/form-data": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+    "node_modules/http-cache-semantics": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+    },
+    "node_modules/http-errors": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
       "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "mime-types": "^2.1.12"
+        "depd": "2.0.0",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "toidentifier": "1.0.1"
       },
       "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/form-data-encoder": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
-      "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
-      "engines": {
-        "node": ">= 14.17"
+        "node": ">= 0.8"
       }
     },
-    "node_modules/formdata-polyfill": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
-      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
+    "node_modules/http-signature": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+      "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
+      "optional": true,
       "dependencies": {
-        "fetch-blob": "^3.1.2"
+        "assert-plus": "^1.0.0",
+        "jsprim": "^1.2.2",
+        "sshpk": "^1.7.0"
       },
       "engines": {
-        "node": ">=12.20.0"
+        "node": ">=0.8",
+        "npm": ">=1.3.7"
       }
     },
-    "node_modules/forwarded": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
-      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+    "node_modules/http2-wrapper": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
+      "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==",
+      "dependencies": {
+        "quick-lru": "^5.1.1",
+        "resolve-alpn": "^1.2.0"
+      },
       "engines": {
-        "node": ">= 0.6"
+        "node": ">=10.19.0"
       }
     },
-    "node_modules/fresh": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+    "node_modules/https-proxy-agent": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+      "dependencies": {
+        "agent-base": "6",
+        "debug": "4"
+      },
       "engines": {
-        "node": ">= 0.6"
+        "node": ">= 6"
       }
     },
-    "node_modules/fs-constants": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
-      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
-    },
-    "node_modules/fs-minipass": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-      "devOptional": true,
+    "node_modules/https-proxy-agent/node_modules/debug": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
       "dependencies": {
-        "minipass": "^3.0.0"
+        "ms": "2.1.2"
       },
       "engines": {
-        "node": ">= 8"
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    "node_modules/https-proxy-agent/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
-    "node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+    "node_modules/human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
       "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
       "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+        "node": ">=10.17.0"
       }
     },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    "node_modules/humanize-ms": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
+      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
+      "optional": true,
+      "dependencies": {
+        "ms": "^2.0.0"
+      }
     },
-    "node_modules/gauge": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
-      "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
-      "devOptional": true,
+    "node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "dependencies": {
-        "aproba": "^1.0.3 || ^2.0.0",
-        "color-support": "^1.1.2",
-        "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.1",
-        "object-assign": "^4.1.1",
-        "signal-exit": "^3.0.0",
-        "string-width": "^4.2.3",
-        "strip-ansi": "^6.0.1",
-        "wide-align": "^1.1.2"
+        "safer-buffer": ">= 2.1.2 < 3"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
     },
-    "node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true,
+    "node_modules/ignore": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
       "engines": {
-        "node": "6.* || 8.* || >= 10.*"
+        "node": ">= 4"
       }
     },
-    "node_modules/get-intrinsic": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
-      "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+    "node_modules/import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
       "dependencies": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.3"
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
       },
       "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/get-package-type": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
-      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+    "node_modules/import-local": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
       "dev": true,
-      "engines": {
-        "node": ">=8.0.0"
-      }
-    },
-    "node_modules/get-stream": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
       "dependencies": {
-        "pump": "^3.0.0"
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      },
+      "bin": {
+        "import-local-fixture": "fixtures/cli.js"
       },
       "engines": {
         "node": ">=8"
@@ -5858,338 +5650,257 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
-      "optional": true,
-      "dependencies": {
-        "assert-plus": "^1.0.0"
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.8.19"
       }
     },
-    "node_modules/gifencoder": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz",
-      "integrity": "sha512-x19DcyWY10SkshBpokqFOo/HBht9GB75evRYvaLMbez9p+yB/o+kt0fK9AwW59nFiAMs2UUQsjv1lX/hvu9Ong==",
-      "optional": true,
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
       "dependencies": {
-        "canvas": "^2.2.0"
+        "once": "^1.3.0",
+        "wrappy": "1"
       }
     },
-    "node_modules/github-from-package": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
-      "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
-    "node_modules/glob": {
-      "version": "7.1.7",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
-      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
+    "node_modules/ini": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
     },
-    "node_modules/glob/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
+    "node_modules/internmap": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
+      "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/glob/node_modules/minimatch": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.1.tgz",
-      "integrity": "sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
       "engines": {
-        "node": "*"
+        "node": ">= 0.10"
       }
     },
-    "node_modules/globals": {
-      "version": "13.19.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
-      "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
-      "dev": true,
-      "dependencies": {
-        "type-fest": "^0.20.2"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
+    "node_modules/is_js": {
+      "version": "0.9.0",
+      "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz",
+      "integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg==",
+      "optional": true
     },
-    "node_modules/good-listener": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
-      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
-      "dependencies": {
-        "delegate": "^3.1.2"
-      }
+    "node_modules/is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
     },
-    "node_modules/got": {
-      "version": "12.5.3",
-      "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz",
-      "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==",
+    "node_modules/is-core-module": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
+      "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+      "devOptional": true,
       "dependencies": {
-        "@sindresorhus/is": "^5.2.0",
-        "@szmarczak/http-timer": "^5.0.1",
-        "cacheable-lookup": "^7.0.0",
-        "cacheable-request": "^10.2.1",
-        "decompress-response": "^6.0.0",
-        "form-data-encoder": "^2.1.2",
-        "get-stream": "^6.0.1",
-        "http2-wrapper": "^2.1.10",
-        "lowercase-keys": "^3.0.0",
-        "p-cancelable": "^3.0.0",
-        "responselike": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=14.16"
+        "has": "^1.0.3"
       },
       "funding": {
-        "url": "https://github.com/sindresorhus/got?sponsor=1"
+        "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/got/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "dev": true,
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/graceful-fs": {
-      "version": "4.2.10",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
-      "dev": true
-    },
-    "node_modules/grapheme-splitter": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
-      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
-      "dev": true
-    },
-    "node_modules/har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
-      "optional": true,
+    "node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "devOptional": true,
       "engines": {
-        "node": ">=4"
+        "node": ">=8"
       }
     },
-    "node_modules/har-validator": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
-      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
-      "deprecated": "this library is no longer supported",
-      "optional": true,
-      "dependencies": {
-        "ajv": "^6.12.3",
-        "har-schema": "^2.0.0"
-      },
+    "node_modules/is-generator-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+      "dev": true,
       "engines": {
         "node": ">=6"
       }
     },
-    "node_modules/has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
       "dependencies": {
-        "function-bind": "^1.1.1"
+        "is-extglob": "^2.1.1"
       },
       "engines": {
-        "node": ">= 0.4.0"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-path-inside": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "dev": true,
       "engines": {
         "node": ">=8"
       }
     },
-    "node_modules/has-symbols": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
-      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+    "node_modules/is-plain-object": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
       "engines": {
-        "node": ">= 0.4"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/has-unicode": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
-      "devOptional": true
+    "node_modules/is-potential-custom-element-name": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
     },
-    "node_modules/html-encoding-sniffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
-      "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
-      "optional": true,
-      "dependencies": {
-        "whatwg-encoding": "^1.0.1"
+    "node_modules/is-stream": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/html-escaper": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
-      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
-      "dev": true
+    "node_modules/is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+      "optional": true
     },
-    "node_modules/htmlparser2": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
-      "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
-      "funding": [
-        "https://github.com/fb55/htmlparser2?sponsor=1",
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/fb55"
-        }
-      ],
-      "dependencies": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
-        "domutils": "^3.0.1",
-        "entities": "^4.3.0"
-      }
+    "node_modules/isarray": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+      "optional": true
     },
-    "node_modules/htmlparser2/node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+    "node_modules/isbinaryfile": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz",
+      "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==",
       "engines": {
-        "node": ">=0.12"
+        "node": ">= 8.0.0"
       },
       "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
+        "url": "https://github.com/sponsors/gjtorikian/"
       }
     },
-    "node_modules/http-cache-semantics": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
-    },
-    "node_modules/http-errors": {
+    "node_modules/isexe": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
-      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
-      "dependencies": {
-        "depd": "2.0.0",
-        "inherits": "2.0.4",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "toidentifier": "1.0.1"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
     },
-    "node_modules/http-proxy-agent": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-      "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
-      "dependencies": {
-        "@tootallnate/once": "1",
-        "agent-base": "6",
-        "debug": "4"
-      },
+    "node_modules/isstream": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
+      "optional": true
+    },
+    "node_modules/istanbul-lib-coverage": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+      "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
+      "dev": true,
       "engines": {
-        "node": ">= 6"
+        "node": ">=8"
       }
     },
-    "node_modules/http-proxy-agent/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+    "node_modules/istanbul-lib-instrument": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+      "dev": true,
       "dependencies": {
-        "ms": "2.1.2"
+        "@babel/core": "^7.12.3",
+        "@babel/parser": "^7.14.7",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-coverage": "^3.2.0",
+        "semver": "^6.3.0"
       },
       "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
+        "node": ">=8"
       }
     },
-    "node_modules/http-proxy-agent/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
-    "node_modules/http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
-      "optional": true,
-      "dependencies": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      },
-      "engines": {
-        "node": ">=0.8",
-        "npm": ">=1.3.7"
+    "node_modules/istanbul-lib-instrument/node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
       }
     },
-    "node_modules/http2-wrapper": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
-      "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==",
+    "node_modules/istanbul-lib-report": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
+      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+      "dev": true,
       "dependencies": {
-        "quick-lru": "^5.1.1",
-        "resolve-alpn": "^1.2.0"
+        "istanbul-lib-coverage": "^3.0.0",
+        "make-dir": "^3.0.0",
+        "supports-color": "^7.1.0"
       },
       "engines": {
-        "node": ">=10.19.0"
+        "node": ">=8"
       }
     },
-    "node_modules/https-proxy-agent": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
-      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+    "node_modules/istanbul-lib-source-maps": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+      "dev": true,
       "dependencies": {
-        "agent-base": "6",
-        "debug": "4"
+        "debug": "^4.1.1",
+        "istanbul-lib-coverage": "^3.0.0",
+        "source-map": "^0.6.1"
       },
       "engines": {
-        "node": ">= 6"
+        "node": ">=10"
       }
     },
-    "node_modules/https-proxy-agent/node_modules/debug": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+    "node_modules/istanbul-lib-source-maps/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
       "dependencies": {
         "ms": "2.1.2"
       },
@@ -6202,1055 +5913,902 @@
         }
       }
     },
-    "node_modules/https-proxy-agent/node_modules/ms": {
+    "node_modules/istanbul-lib-source-maps/node_modules/ms": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
     },
-    "node_modules/human-signals": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
-      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+    "node_modules/istanbul-reports": {
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
+      "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
       "dev": true,
+      "dependencies": {
+        "html-escaper": "^2.0.0",
+        "istanbul-lib-report": "^3.0.0"
+      },
       "engines": {
-        "node": ">=10.17.0"
+        "node": ">=8"
       }
     },
-    "node_modules/humanize-ms": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
-      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
-      "optional": true,
-      "dependencies": {
-        "ms": "^2.0.0"
-      }
+    "node_modules/iterate-object": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz",
+      "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw=="
     },
-    "node_modules/iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+    "node_modules/jake": {
+      "version": "10.8.5",
+      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
+      "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
       "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3"
+        "async": "^3.2.3",
+        "chalk": "^4.0.2",
+        "filelist": "^1.0.1",
+        "minimatch": "^3.0.4"
+      },
+      "bin": {
+        "jake": "bin/cli.js"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">=10"
       }
     },
-    "node_modules/ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/ignore": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
-      "engines": {
-        "node": ">= 4"
+    "node_modules/jake/node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
-    "node_modules/import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+    "node_modules/jake/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dependencies": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
+        "brace-expansion": "^1.1.7"
       },
       "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": "*"
       }
     },
-    "node_modules/import-local": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
-      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+    "node_modules/jest": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz",
+      "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==",
       "dev": true,
       "dependencies": {
-        "pkg-dir": "^4.2.0",
-        "resolve-cwd": "^3.0.0"
+        "@jest/core": "^29.3.1",
+        "@jest/types": "^29.3.1",
+        "import-local": "^3.0.2",
+        "jest-cli": "^29.3.1"
       },
       "bin": {
-        "import-local-fixture": "fixtures/cli.js"
+        "jest": "bin/jest.js"
       },
       "engines": {
-        "node": ">=8"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+      },
+      "peerDependenciesMeta": {
+        "node-notifier": {
+          "optional": true
+        }
       }
     },
-    "node_modules/imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+    "node_modules/jest-changed-files": {
+      "version": "29.2.0",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz",
+      "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==",
       "dev": true,
+      "dependencies": {
+        "execa": "^5.0.0",
+        "p-limit": "^3.1.0"
+      },
       "engines": {
-        "node": ">=0.8.19"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+    "node_modules/jest-circus": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz",
+      "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==",
+      "dev": true,
       "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "node_modules/ini": {
-      "version": "1.3.8",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
-    },
-    "node_modules/internmap": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
-      "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==",
+        "@jest/environment": "^29.3.1",
+        "@jest/expect": "^29.3.1",
+        "@jest/test-result": "^29.3.1",
+        "@jest/types": "^29.3.1",
+        "@types/node": "*",
+        "chalk": "^4.0.0",
+        "co": "^4.6.0",
+        "dedent": "^0.7.0",
+        "is-generator-fn": "^2.0.0",
+        "jest-each": "^29.3.1",
+        "jest-matcher-utils": "^29.3.1",
+        "jest-message-util": "^29.3.1",
+        "jest-runtime": "^29.3.1",
+        "jest-snapshot": "^29.3.1",
+        "jest-util": "^29.3.1",
+        "p-limit": "^3.1.0",
+        "pretty-format": "^29.3.1",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.3"
+      },
       "engines": {
-        "node": ">=12"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/ipaddr.js": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+    "node_modules/jest-cli": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz",
+      "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==",
+      "dev": true,
+      "dependencies": {
+        "@jest/core": "^29.3.1",
+        "@jest/test-result": "^29.3.1",
+        "@jest/types": "^29.3.1",
+        "chalk": "^4.0.0",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.9",
+        "import-local": "^3.0.2",
+        "jest-config": "^29.3.1",
+        "jest-util": "^29.3.1",
+        "jest-validate": "^29.3.1",
+        "prompts": "^2.0.1",
+        "yargs": "^17.3.1"
+      },
+      "bin": {
+        "jest": "bin/jest.js"
+      },
       "engines": {
-        "node": ">= 0.10"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+      },
+      "peerDependenciesMeta": {
+        "node-notifier": {
+          "optional": true
+        }
       }
     },
-    "node_modules/is_js": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz",
-      "integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg==",
-      "optional": true
-    },
-    "node_modules/is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
-    },
-    "node_modules/is-core-module": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
-      "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
-      "devOptional": true,
+    "node_modules/jest-config": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz",
+      "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==",
+      "dev": true,
       "dependencies": {
-        "has": "^1.0.3"
+        "@babel/core": "^7.11.6",
+        "@jest/test-sequencer": "^29.3.1",
+        "@jest/types": "^29.3.1",
+        "babel-jest": "^29.3.1",
+        "chalk": "^4.0.0",
+        "ci-info": "^3.2.0",
+        "deepmerge": "^4.2.2",
+        "glob": "^7.1.3",
+        "graceful-fs": "^4.2.9",
+        "jest-circus": "^29.3.1",
+        "jest-environment-node": "^29.3.1",
+        "jest-get-type": "^29.2.0",
+        "jest-regex-util": "^29.2.0",
+        "jest-resolve": "^29.3.1",
+        "jest-runner": "^29.3.1",
+        "jest-util": "^29.3.1",
+        "jest-validate": "^29.3.1",
+        "micromatch": "^4.0.4",
+        "parse-json": "^5.2.0",
+        "pretty-format": "^29.3.1",
+        "slash": "^3.0.0",
+        "strip-json-comments": "^3.1.1"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "peerDependencies": {
+        "@types/node": "*",
+        "ts-node": ">=9.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "ts-node": {
+          "optional": true
+        }
       }
     },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+    "node_modules/jest-diff": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz",
+      "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==",
       "dev": true,
+      "dependencies": {
+        "chalk": "^4.0.0",
+        "diff-sequences": "^29.3.1",
+        "jest-get-type": "^29.2.0",
+        "pretty-format": "^29.3.1"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "devOptional": true,
+    "node_modules/jest-docblock": {
+      "version": "29.2.0",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz",
+      "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==",
+      "dev": true,
+      "dependencies": {
+        "detect-newline": "^3.0.0"
+      },
       "engines": {
-        "node": ">=8"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/is-generator-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
-      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+    "node_modules/jest-each": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz",
+      "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==",
       "dev": true,
+      "dependencies": {
+        "@jest/types": "^29.3.1",
+        "chalk": "^4.0.0",
+        "jest-get-type": "^29.2.0",
+        "jest-util": "^29.3.1",
+        "pretty-format": "^29.3.1"
+      },
       "engines": {
-        "node": ">=6"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+    "node_modules/jest-environment-node": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz",
+      "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==",
       "dev": true,
       "dependencies": {
-        "is-extglob": "^2.1.1"
+        "@jest/environment": "^29.3.1",
+        "@jest/fake-timers": "^29.3.1",
+        "@jest/types": "^29.3.1",
+        "@types/node": "*",
+        "jest-mock": "^29.3.1",
+        "jest-util": "^29.3.1"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+    "node_modules/jest-get-type": {
+      "version": "29.2.0",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz",
+      "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==",
       "dev": true,
       "engines": {
-        "node": ">=0.12.0"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/is-path-inside": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
-      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+    "node_modules/jest-haste-map": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz",
+      "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==",
       "dev": true,
+      "dependencies": {
+        "@jest/types": "^29.3.1",
+        "@types/graceful-fs": "^4.1.3",
+        "@types/node": "*",
+        "anymatch": "^3.0.3",
+        "fb-watchman": "^2.0.0",
+        "graceful-fs": "^4.2.9",
+        "jest-regex-util": "^29.2.0",
+        "jest-util": "^29.3.1",
+        "jest-worker": "^29.3.1",
+        "micromatch": "^4.0.4",
+        "walker": "^1.0.8"
+      },
       "engines": {
-        "node": ">=8"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "^2.3.2"
       }
     },
-    "node_modules/is-plain-object": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
-      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+    "node_modules/jest-leak-detector": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz",
+      "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==",
+      "dev": true,
+      "dependencies": {
+        "jest-get-type": "^29.2.0",
+        "pretty-format": "^29.3.1"
+      },
       "engines": {
-        "node": ">=0.10.0"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/is-potential-custom-element-name": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
-      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
-    },
-    "node_modules/is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
-      "optional": true
-    },
-    "node_modules/isarray": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
-      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
-      "optional": true
-    },
-    "node_modules/isbinaryfile": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz",
-      "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==",
-      "engines": {
-        "node": ">= 8.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/gjtorikian/"
-      }
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "node_modules/isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
-      "optional": true
-    },
-    "node_modules/istanbul-lib-coverage": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
-      "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-instrument": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
-      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+    "node_modules/jest-matcher-utils": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz",
+      "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==",
       "dev": true,
       "dependencies": {
-        "@babel/core": "^7.12.3",
-        "@babel/parser": "^7.14.7",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-coverage": "^3.2.0",
-        "semver": "^6.3.0"
+        "chalk": "^4.0.0",
+        "jest-diff": "^29.3.1",
+        "jest-get-type": "^29.2.0",
+        "pretty-format": "^29.3.1"
       },
       "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-instrument/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+    "node_modules/jest-message-util": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz",
+      "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==",
       "dev": true,
       "dependencies": {
-        "istanbul-lib-coverage": "^3.0.0",
-        "make-dir": "^3.0.0",
-        "supports-color": "^7.1.0"
+        "@babel/code-frame": "^7.12.13",
+        "@jest/types": "^29.3.1",
+        "@types/stack-utils": "^2.0.0",
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "micromatch": "^4.0.4",
+        "pretty-format": "^29.3.1",
+        "slash": "^3.0.0",
+        "stack-utils": "^2.0.3"
       },
       "engines": {
-        "node": ">=8"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/istanbul-lib-source-maps": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
-      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+    "node_modules/jest-mock": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz",
+      "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==",
       "dev": true,
       "dependencies": {
-        "debug": "^4.1.1",
-        "istanbul-lib-coverage": "^3.0.0",
-        "source-map": "^0.6.1"
+        "@jest/types": "^29.3.1",
+        "@types/node": "*",
+        "jest-util": "^29.3.1"
       },
       "engines": {
-        "node": ">=10"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/istanbul-lib-source-maps/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+    "node_modules/jest-pnp-resolver": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
+      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
       "dev": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
       "engines": {
-        "node": ">=6.0"
+        "node": ">=6"
+      },
+      "peerDependencies": {
+        "jest-resolve": "*"
       },
       "peerDependenciesMeta": {
-        "supports-color": {
+        "jest-resolve": {
           "optional": true
         }
       }
     },
-    "node_modules/istanbul-lib-source-maps/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
-    "node_modules/istanbul-reports": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
-      "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+    "node_modules/jest-regex-util": {
+      "version": "29.2.0",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz",
+      "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==",
       "dev": true,
-      "dependencies": {
-        "html-escaper": "^2.0.0",
-        "istanbul-lib-report": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/iterate-object": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz",
-      "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw=="
-    },
-    "node_modules/jake": {
-      "version": "10.8.5",
-      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
-      "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
-      "dependencies": {
-        "async": "^3.2.3",
-        "chalk": "^4.0.2",
-        "filelist": "^1.0.1",
-        "minimatch": "^3.0.4"
-      },
-      "bin": {
-        "jake": "bin/cli.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jake/node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/jake/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
       "engines": {
-        "node": "*"
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest": {
+    "node_modules/jest-resolve": {
       "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz",
-      "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz",
+      "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.3.1",
-        "@jest/types": "^29.3.1",
-        "import-local": "^3.0.2",
-        "jest-cli": "^29.3.1"
-      },
-      "bin": {
-        "jest": "bin/jest.js"
+        "chalk": "^4.0.0",
+        "graceful-fs": "^4.2.9",
+        "jest-haste-map": "^29.3.1",
+        "jest-pnp-resolver": "^1.2.2",
+        "jest-util": "^29.3.1",
+        "jest-validate": "^29.3.1",
+        "resolve": "^1.20.0",
+        "resolve.exports": "^1.1.0",
+        "slash": "^3.0.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      },
-      "peerDependencies": {
-        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
-      },
-      "peerDependenciesMeta": {
-        "node-notifier": {
-          "optional": true
-        }
       }
     },
-    "node_modules/jest-changed-files": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz",
-      "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==",
+    "node_modules/jest-resolve-dependencies": {
+      "version": "29.3.1",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz",
+      "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==",
       "dev": true,
       "dependencies": {
-        "execa": "^5.0.0",
-        "p-limit": "^3.1.0"
+        "jest-regex-util": "^29.2.0",
+        "jest-snapshot": "^29.3.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-circus": {
+    "node_modules/jest-runner": {
       "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz",
-      "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz",
+      "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==",
       "dev": true,
       "dependencies": {
+        "@jest/console": "^29.3.1",
         "@jest/environment": "^29.3.1",
-        "@jest/expect": "^29.3.1",
         "@jest/test-result": "^29.3.1",
+        "@jest/transform": "^29.3.1",
         "@jest/types": "^29.3.1",
         "@types/node": "*",
         "chalk": "^4.0.0",
-        "co": "^4.6.0",
-        "dedent": "^0.7.0",
-        "is-generator-fn": "^2.0.0",
-        "jest-each": "^29.3.1",
-        "jest-matcher-utils": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-runtime": "^29.3.1",
-        "jest-snapshot": "^29.3.1",
+        "emittery": "^0.13.1",
+        "graceful-fs": "^4.2.9",
+        "jest-docblock": "^29.2.0",
+        "jest-environment-node": "^29.3.1",
+        "jest-haste-map": "^29.3.1",
+        "jest-leak-detector": "^29.3.1",
+        "jest-message-util": "^29.3.1",
+        "jest-resolve": "^29.3.1",
+        "jest-runtime": "^29.3.1",
         "jest-util": "^29.3.1",
+        "jest-watcher": "^29.3.1",
+        "jest-worker": "^29.3.1",
         "p-limit": "^3.1.0",
-        "pretty-format": "^29.3.1",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.3"
+        "source-map-support": "0.5.13"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-cli": {
+    "node_modules/jest-runtime": {
       "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz",
-      "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz",
+      "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.3.1",
+        "@jest/environment": "^29.3.1",
+        "@jest/fake-timers": "^29.3.1",
+        "@jest/globals": "^29.3.1",
+        "@jest/source-map": "^29.2.0",
         "@jest/test-result": "^29.3.1",
+        "@jest/transform": "^29.3.1",
         "@jest/types": "^29.3.1",
+        "@types/node": "*",
         "chalk": "^4.0.0",
-        "exit": "^0.1.2",
+        "cjs-module-lexer": "^1.0.0",
+        "collect-v8-coverage": "^1.0.0",
+        "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "import-local": "^3.0.2",
-        "jest-config": "^29.3.1",
+        "jest-haste-map": "^29.3.1",
+        "jest-message-util": "^29.3.1",
+        "jest-mock": "^29.3.1",
+        "jest-regex-util": "^29.2.0",
+        "jest-resolve": "^29.3.1",
+        "jest-snapshot": "^29.3.1",
         "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
-        "prompts": "^2.0.1",
-        "yargs": "^17.3.1"
-      },
-      "bin": {
-        "jest": "bin/jest.js"
+        "slash": "^3.0.0",
+        "strip-bom": "^4.0.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      },
-      "peerDependencies": {
-        "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
-      },
-      "peerDependenciesMeta": {
-        "node-notifier": {
-          "optional": true
-        }
       }
     },
-    "node_modules/jest-config": {
+    "node_modules/jest-snapshot": {
       "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz",
-      "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz",
+      "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
-        "@jest/test-sequencer": "^29.3.1",
+        "@babel/generator": "^7.7.2",
+        "@babel/plugin-syntax-jsx": "^7.7.2",
+        "@babel/plugin-syntax-typescript": "^7.7.2",
+        "@babel/traverse": "^7.7.2",
+        "@babel/types": "^7.3.3",
+        "@jest/expect-utils": "^29.3.1",
+        "@jest/transform": "^29.3.1",
         "@jest/types": "^29.3.1",
-        "babel-jest": "^29.3.1",
+        "@types/babel__traverse": "^7.0.6",
+        "@types/prettier": "^2.1.5",
+        "babel-preset-current-node-syntax": "^1.0.0",
         "chalk": "^4.0.0",
-        "ci-info": "^3.2.0",
-        "deepmerge": "^4.2.2",
-        "glob": "^7.1.3",
+        "expect": "^29.3.1",
         "graceful-fs": "^4.2.9",
-        "jest-circus": "^29.3.1",
-        "jest-environment-node": "^29.3.1",
+        "jest-diff": "^29.3.1",
         "jest-get-type": "^29.2.0",
-        "jest-regex-util": "^29.2.0",
-        "jest-resolve": "^29.3.1",
-        "jest-runner": "^29.3.1",
+        "jest-haste-map": "^29.3.1",
+        "jest-matcher-utils": "^29.3.1",
+        "jest-message-util": "^29.3.1",
         "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
-        "micromatch": "^4.0.4",
-        "parse-json": "^5.2.0",
+        "natural-compare": "^1.4.0",
         "pretty-format": "^29.3.1",
-        "slash": "^3.0.0",
-        "strip-json-comments": "^3.1.1"
+        "semver": "^7.3.5"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      },
-      "peerDependencies": {
-        "@types/node": "*",
-        "ts-node": ">=9.0.0"
-      },
-      "peerDependenciesMeta": {
-        "@types/node": {
-          "optional": true
-        },
-        "ts-node": {
-          "optional": true
-        }
       }
     },
-    "node_modules/jest-diff": {
+    "node_modules/jest-util": {
       "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz",
-      "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz",
+      "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==",
       "dev": true,
       "dependencies": {
+        "@jest/types": "^29.3.1",
+        "@types/node": "*",
         "chalk": "^4.0.0",
-        "diff-sequences": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
-    "node_modules/jest-docblock": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz",
-      "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==",
-      "dev": true,
-      "dependencies": {
-        "detect-newline": "^3.0.0"
+        "ci-info": "^3.2.0",
+        "graceful-fs": "^4.2.9",
+        "picomatch": "^2.2.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-each": {
+    "node_modules/jest-validate": {
       "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz",
-      "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz",
+      "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.3.1",
+        "camelcase": "^6.2.0",
         "chalk": "^4.0.0",
         "jest-get-type": "^29.2.0",
-        "jest-util": "^29.3.1",
+        "leven": "^3.1.0",
         "pretty-format": "^29.3.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-environment-node": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz",
-      "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^29.3.1",
-        "@jest/fake-timers": "^29.3.1",
-        "@jest/types": "^29.3.1",
-        "@types/node": "*",
-        "jest-mock": "^29.3.1",
-        "jest-util": "^29.3.1"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
-    "node_modules/jest-get-type": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz",
-      "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==",
+    "node_modules/jest-validate/node_modules/camelcase": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
       "dev": true,
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/jest-haste-map": {
+    "node_modules/jest-watcher": {
       "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz",
-      "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz",
+      "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==",
       "dev": true,
       "dependencies": {
+        "@jest/test-result": "^29.3.1",
         "@jest/types": "^29.3.1",
-        "@types/graceful-fs": "^4.1.3",
         "@types/node": "*",
-        "anymatch": "^3.0.3",
-        "fb-watchman": "^2.0.0",
-        "graceful-fs": "^4.2.9",
-        "jest-regex-util": "^29.2.0",
+        "ansi-escapes": "^4.2.1",
+        "chalk": "^4.0.0",
+        "emittery": "^0.13.1",
         "jest-util": "^29.3.1",
-        "jest-worker": "^29.3.1",
-        "micromatch": "^4.0.4",
-        "walker": "^1.0.8"
+        "string-length": "^4.0.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "^2.3.2"
       }
     },
-    "node_modules/jest-leak-detector": {
+    "node_modules/jest-worker": {
       "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz",
-      "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz",
+      "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==",
       "dev": true,
       "dependencies": {
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
+        "@types/node": "*",
+        "jest-util": "^29.3.1",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-matcher-utils": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz",
-      "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==",
+    "node_modules/jest-worker/node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
       "dev": true,
       "dependencies": {
-        "chalk": "^4.0.0",
-        "jest-diff": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
+        "has-flag": "^4.0.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
-    "node_modules/jest-message-util": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz",
-      "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==",
-      "dev": true,
+    "node_modules/js-sdsl": {
+      "version": "4.1.4",
+      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
+      "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==",
+      "dev": true
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "node_modules/js-yaml": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
       "dependencies": {
-        "@babel/code-frame": "^7.12.13",
-        "@jest/types": "^29.3.1",
-        "@types/stack-utils": "^2.0.0",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.9",
-        "micromatch": "^4.0.4",
-        "pretty-format": "^29.3.1",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.3"
+        "argparse": "^2.0.1"
       },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
-      }
-    },
-    "node_modules/jest-mock": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz",
-      "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==",
-      "dev": true,
-      "dependencies": {
-        "@jest/types": "^29.3.1",
-        "@types/node": "*",
-        "jest-util": "^29.3.1"
-      },
-      "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
       }
     },
-    "node_modules/jest-pnp-resolver": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
-      "dev": true,
+    "node_modules/jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+      "optional": true
+    },
+    "node_modules/jsdom": {
+      "version": "20.0.3",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
+      "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+      "dependencies": {
+        "abab": "^2.0.6",
+        "acorn": "^8.8.1",
+        "acorn-globals": "^7.0.0",
+        "cssom": "^0.5.0",
+        "cssstyle": "^2.3.0",
+        "data-urls": "^3.0.2",
+        "decimal.js": "^10.4.2",
+        "domexception": "^4.0.0",
+        "escodegen": "^2.0.0",
+        "form-data": "^4.0.0",
+        "html-encoding-sniffer": "^3.0.0",
+        "http-proxy-agent": "^5.0.0",
+        "https-proxy-agent": "^5.0.1",
+        "is-potential-custom-element-name": "^1.0.1",
+        "nwsapi": "^2.2.2",
+        "parse5": "^7.1.1",
+        "saxes": "^6.0.0",
+        "symbol-tree": "^3.2.4",
+        "tough-cookie": "^4.1.2",
+        "w3c-xmlserializer": "^4.0.0",
+        "webidl-conversions": "^7.0.0",
+        "whatwg-encoding": "^2.0.0",
+        "whatwg-mimetype": "^3.0.0",
+        "whatwg-url": "^11.0.0",
+        "ws": "^8.11.0",
+        "xml-name-validator": "^4.0.0"
+      },
       "engines": {
-        "node": ">=6"
+        "node": ">=14"
       },
       "peerDependencies": {
-        "jest-resolve": "*"
+        "canvas": "^2.5.0"
       },
       "peerDependenciesMeta": {
-        "jest-resolve": {
+        "canvas": {
           "optional": true
         }
       }
     },
-    "node_modules/jest-regex-util": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz",
-      "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==",
-      "dev": true,
+    "node_modules/jsdom/node_modules/@tootallnate/once": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+      "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">= 10"
       }
     },
-    "node_modules/jest-resolve": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz",
-      "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==",
-      "dev": true,
+    "node_modules/jsdom/node_modules/data-urls": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+      "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
       "dependencies": {
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.3.1",
-        "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
-        "resolve": "^1.20.0",
-        "resolve.exports": "^1.1.0",
-        "slash": "^3.0.0"
+        "abab": "^2.0.6",
+        "whatwg-mimetype": "^3.0.0",
+        "whatwg-url": "^11.0.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=12"
       }
     },
-    "node_modules/jest-resolve-dependencies": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz",
-      "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==",
-      "dev": true,
+    "node_modules/jsdom/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dependencies": {
-        "jest-regex-util": "^29.2.0",
-        "jest-snapshot": "^29.3.1"
+        "ms": "2.1.2"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "node_modules/jest-runner": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz",
-      "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==",
-      "dev": true,
+    "node_modules/jsdom/node_modules/domexception": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+      "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
       "dependencies": {
-        "@jest/console": "^29.3.1",
-        "@jest/environment": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "emittery": "^0.13.1",
-        "graceful-fs": "^4.2.9",
-        "jest-docblock": "^29.2.0",
-        "jest-environment-node": "^29.3.1",
-        "jest-haste-map": "^29.3.1",
-        "jest-leak-detector": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-resolve": "^29.3.1",
-        "jest-runtime": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-watcher": "^29.3.1",
-        "jest-worker": "^29.3.1",
-        "p-limit": "^3.1.0",
-        "source-map-support": "0.5.13"
+        "webidl-conversions": "^7.0.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=12"
       }
     },
-    "node_modules/jest-runtime": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz",
-      "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==",
-      "dev": true,
+    "node_modules/jsdom/node_modules/escodegen": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+      "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
       "dependencies": {
-        "@jest/environment": "^29.3.1",
-        "@jest/fake-timers": "^29.3.1",
-        "@jest/globals": "^29.3.1",
-        "@jest/source-map": "^29.2.0",
-        "@jest/test-result": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "cjs-module-lexer": "^1.0.0",
-        "collect-v8-coverage": "^1.0.0",
-        "glob": "^7.1.3",
-        "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-mock": "^29.3.1",
-        "jest-regex-util": "^29.2.0",
-        "jest-resolve": "^29.3.1",
-        "jest-snapshot": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "slash": "^3.0.0",
-        "strip-bom": "^4.0.0"
+        "esprima": "^4.0.1",
+        "estraverse": "^5.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1"
+      },
+      "bin": {
+        "escodegen": "bin/escodegen.js",
+        "esgenerate": "bin/esgenerate.js"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=6.0"
+      },
+      "optionalDependencies": {
+        "source-map": "~0.6.1"
       }
     },
-    "node_modules/jest-snapshot": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz",
-      "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==",
-      "dev": true,
+    "node_modules/jsdom/node_modules/http-proxy-agent": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+      "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
       "dependencies": {
-        "@babel/core": "^7.11.6",
-        "@babel/generator": "^7.7.2",
-        "@babel/plugin-syntax-jsx": "^7.7.2",
-        "@babel/plugin-syntax-typescript": "^7.7.2",
-        "@babel/traverse": "^7.7.2",
-        "@babel/types": "^7.3.3",
-        "@jest/expect-utils": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
-        "@types/babel__traverse": "^7.0.6",
-        "@types/prettier": "^2.1.5",
-        "babel-preset-current-node-syntax": "^1.0.0",
-        "chalk": "^4.0.0",
-        "expect": "^29.3.1",
-        "graceful-fs": "^4.2.9",
-        "jest-diff": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "jest-haste-map": "^29.3.1",
-        "jest-matcher-utils": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "natural-compare": "^1.4.0",
-        "pretty-format": "^29.3.1",
-        "semver": "^7.3.5"
+        "@tootallnate/once": "2",
+        "agent-base": "6",
+        "debug": "4"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">= 6"
       }
     },
-    "node_modules/jest-util": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz",
-      "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==",
-      "dev": true,
+    "node_modules/jsdom/node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
       "dependencies": {
-        "@jest/types": "^29.3.1",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "ci-info": "^3.2.0",
-        "graceful-fs": "^4.2.9",
-        "picomatch": "^2.2.3"
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=0.10.0"
       }
     },
-    "node_modules/jest-validate": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz",
-      "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==",
-      "dev": true,
+    "node_modules/jsdom/node_modules/levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
       "dependencies": {
-        "@jest/types": "^29.3.1",
-        "camelcase": "^6.2.0",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^29.2.0",
-        "leven": "^3.1.0",
-        "pretty-format": "^29.3.1"
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/jest-validate/node_modules/camelcase": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
+    "node_modules/jsdom/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/jsdom/node_modules/optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+      "dependencies": {
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+      "engines": {
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/jest-watcher": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz",
-      "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==",
-      "dev": true,
-      "dependencies": {
-        "@jest/test-result": "^29.3.1",
-        "@jest/types": "^29.3.1",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "emittery": "^0.13.1",
-        "jest-util": "^29.3.1",
-        "string-length": "^4.0.1"
-      },
+    "node_modules/jsdom/node_modules/prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/jest-worker": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz",
-      "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==",
-      "dev": true,
+    "node_modules/jsdom/node_modules/saxes": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+      "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
       "dependencies": {
-        "@types/node": "*",
-        "jest-util": "^29.3.1",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
+        "xmlchars": "^2.2.0"
       },
       "engines": {
-        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+        "node": ">=v12.22.7"
       }
     },
-    "node_modules/jest-worker/node_modules/supports-color": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-      "dev": true,
+    "node_modules/jsdom/node_modules/type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
       "dependencies": {
-        "has-flag": "^4.0.0"
+        "prelude-ls": "~1.1.2"
       },
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/supports-color?sponsor=1"
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/js-sdsl": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
-      "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==",
-      "dev": true
-    },
-    "node_modules/js-tokens": {
+    "node_modules/jsdom/node_modules/w3c-xmlserializer": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-    },
-    "node_modules/js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
+      "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
       "dependencies": {
-        "argparse": "^2.0.1"
+        "xml-name-validator": "^4.0.0"
       },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
+      "engines": {
+        "node": ">=14"
       }
     },
-    "node_modules/jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
-      "optional": true
-    },
-    "node_modules/jsdom": {
-      "version": "9.12.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz",
-      "integrity": "sha512-Qw4oqNxo4LyzkSqVIyCnEltTc4xV3g1GBaI88AvYTesWzmWHUSoMNmhBjUBa+6ldXIBJS9xoeLNJPfUAykTyxw==",
-      "optional": true,
+    "node_modules/jsdom/node_modules/whatwg-encoding": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+      "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
       "dependencies": {
-        "abab": "^1.0.3",
-        "acorn": "^4.0.4",
-        "acorn-globals": "^3.1.0",
-        "array-equal": "^1.0.0",
-        "content-type-parser": "^1.0.1",
-        "cssom": ">= 0.3.2 < 0.4.0",
-        "cssstyle": ">= 0.2.37 < 0.3.0",
-        "escodegen": "^1.6.1",
-        "html-encoding-sniffer": "^1.0.1",
-        "nwmatcher": ">= 1.3.9 < 2.0.0",
-        "parse5": "^1.5.1",
-        "request": "^2.79.0",
-        "sax": "^1.2.1",
-        "symbol-tree": "^3.2.1",
-        "tough-cookie": "^2.3.2",
-        "webidl-conversions": "^4.0.0",
-        "whatwg-encoding": "^1.0.1",
-        "whatwg-url": "^4.3.0",
-        "xml-name-validator": "^2.0.1"
+        "iconv-lite": "0.6.3"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/jsdom/node_modules/acorn": {
-      "version": "4.0.13",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
-      "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==",
-      "optional": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
+    "node_modules/jsdom/node_modules/whatwg-mimetype": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+      "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
       "engines": {
-        "node": ">=0.4.0"
+        "node": ">=12"
       }
     },
-    "node_modules/jsdom/node_modules/parse5": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
-      "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==",
-      "optional": true
+    "node_modules/jsdom/node_modules/ws": {
+      "version": "8.11.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+      "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
     },
     "node_modules/jsesc": {
       "version": "2.5.2",
@@ -7426,11 +6984,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
     "node_modules/lodash.merge": {
       "version": "4.6.2",
       "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -7783,6 +7336,131 @@
         "underscore.string": "^3.3.4"
       }
     },
+    "node_modules/node-chartist/node_modules/abab": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
+      "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==",
+      "optional": true
+    },
+    "node_modules/node-chartist/node_modules/acorn": {
+      "version": "4.0.13",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+      "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==",
+      "optional": true,
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/node-chartist/node_modules/acorn-globals": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
+      "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==",
+      "optional": true,
+      "dependencies": {
+        "acorn": "^4.0.4"
+      }
+    },
+    "node_modules/node-chartist/node_modules/cssom": {
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+      "optional": true
+    },
+    "node_modules/node-chartist/node_modules/cssstyle": {
+      "version": "0.2.37",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
+      "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==",
+      "optional": true,
+      "dependencies": {
+        "cssom": "0.3.x"
+      }
+    },
+    "node_modules/node-chartist/node_modules/html-encoding-sniffer": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
+      "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
+      "optional": true,
+      "dependencies": {
+        "whatwg-encoding": "^1.0.1"
+      }
+    },
+    "node_modules/node-chartist/node_modules/jsdom": {
+      "version": "9.12.0",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz",
+      "integrity": "sha512-Qw4oqNxo4LyzkSqVIyCnEltTc4xV3g1GBaI88AvYTesWzmWHUSoMNmhBjUBa+6ldXIBJS9xoeLNJPfUAykTyxw==",
+      "optional": true,
+      "dependencies": {
+        "abab": "^1.0.3",
+        "acorn": "^4.0.4",
+        "acorn-globals": "^3.1.0",
+        "array-equal": "^1.0.0",
+        "content-type-parser": "^1.0.1",
+        "cssom": ">= 0.3.2 < 0.4.0",
+        "cssstyle": ">= 0.2.37 < 0.3.0",
+        "escodegen": "^1.6.1",
+        "html-encoding-sniffer": "^1.0.1",
+        "nwmatcher": ">= 1.3.9 < 2.0.0",
+        "parse5": "^1.5.1",
+        "request": "^2.79.0",
+        "sax": "^1.2.1",
+        "symbol-tree": "^3.2.1",
+        "tough-cookie": "^2.3.2",
+        "webidl-conversions": "^4.0.0",
+        "whatwg-encoding": "^1.0.1",
+        "whatwg-url": "^4.3.0",
+        "xml-name-validator": "^2.0.1"
+      }
+    },
+    "node_modules/node-chartist/node_modules/parse5": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+      "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==",
+      "optional": true
+    },
+    "node_modules/node-chartist/node_modules/tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "optional": true,
+      "dependencies": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/node-chartist/node_modules/webidl-conversions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+      "optional": true
+    },
+    "node_modules/node-chartist/node_modules/whatwg-url": {
+      "version": "4.8.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz",
+      "integrity": "sha512-nUvUPuenPFtPfy/X+dAYh/TfRbTBlnXTM5iIfLseJFkkQewmpG9pGR6i87E9qL+lZaJzv+99kkQWoGOtLfkZQQ==",
+      "optional": true,
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
+    "node_modules/node-chartist/node_modules/whatwg-url/node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+      "optional": true
+    },
+    "node_modules/node-chartist/node_modules/xml-name-validator": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
+      "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==",
+      "optional": true
+    },
     "node_modules/node-domexception": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
@@ -8845,6 +8523,19 @@
         "node": ">=0.6"
       }
     },
+    "node_modules/request/node_modules/tough-cookie": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+      "optional": true,
+      "dependencies": {
+        "psl": "^1.1.28",
+        "punycode": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -9066,17 +8757,6 @@
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
     },
-    "node_modules/saxes": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
-      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
-      "dependencies": {
-        "xmlchars": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/select": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
@@ -9915,16 +9595,17 @@
       }
     },
     "node_modules/tough-cookie": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-      "optional": true,
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
+      "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
       "dependencies": {
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
+        "psl": "^1.1.33",
+        "punycode": "^2.1.1",
+        "universalify": "^0.2.0",
+        "url-parse": "^1.5.3"
       },
       "engines": {
-        "node": ">=0.8"
+        "node": ">=6"
       }
     },
     "node_modules/tr46": {
@@ -10193,30 +9874,6 @@
       "resolved": "https://registry.npmjs.org/vue-prism-component/-/vue-prism-component-1.2.0.tgz",
       "integrity": "sha512-0N9CNuQu+36CJpdsZHrhdq7d18oBvjVMjawyKdIr8xuzFWLfdxECZQYbFaYoopPBg3SvkEEMtkhYqdgTQl5Y+A=="
     },
-    "node_modules/w3c-hr-time": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
-      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
-      "dependencies": {
-        "browser-process-hrtime": "^1.0.0"
-      }
-    },
-    "node_modules/w3c-xmlserializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
-      "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
-      "dependencies": {
-        "xml-name-validator": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
-      "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
-    },
     "node_modules/walker": {
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
@@ -10235,39 +9892,44 @@
       }
     },
     "node_modules/webidl-conversions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
-      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
-      "optional": true
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+      "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+      "engines": {
+        "node": ">=12"
+      }
     },
     "node_modules/whatwg-encoding": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
       "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+      "optional": true,
       "dependencies": {
         "iconv-lite": "0.4.24"
       }
     },
-    "node_modules/whatwg-mimetype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
-      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
-    },
     "node_modules/whatwg-url": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz",
-      "integrity": "sha512-nUvUPuenPFtPfy/X+dAYh/TfRbTBlnXTM5iIfLseJFkkQewmpG9pGR6i87E9qL+lZaJzv+99kkQWoGOtLfkZQQ==",
-      "optional": true,
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+      "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
       "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
+        "tr46": "^3.0.0",
+        "webidl-conversions": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/whatwg-url/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
-      "optional": true
+    "node_modules/whatwg-url/node_modules/tr46": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+      "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+      "dependencies": {
+        "punycode": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=12"
+      }
     },
     "node_modules/which": {
       "version": "2.0.2",
@@ -10374,10 +10036,12 @@
       }
     },
     "node_modules/xml-name-validator": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
-      "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==",
-      "optional": true
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+      "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+      "engines": {
+        "node": ">=12"
+      }
     },
     "node_modules/xml-parser-xo": {
       "version": "4.0.1",
@@ -12103,11 +11767,6 @@
       "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
       "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="
     },
-    "@tootallnate/once": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
-      "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
-    },
     "@trysound/sax": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
@@ -12245,10 +11904,9 @@
       }
     },
     "abab": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
-      "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==",
-      "optional": true
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+      "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
     },
     "abbrev": {
       "version": "1.1.1",
@@ -12266,24 +11924,23 @@
       }
     },
     "acorn": {
-      "version": "8.8.0",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz",
-      "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w=="
+      "version": "8.8.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
+      "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA=="
     },
     "acorn-globals": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
-      "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==",
-      "optional": true,
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
+      "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
       "requires": {
-        "acorn": "^4.0.4"
+        "acorn": "^8.1.0",
+        "acorn-walk": "^8.0.2"
       },
       "dependencies": {
-        "acorn": {
-          "version": "4.0.13",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
-          "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==",
-          "optional": true
+        "acorn-walk": {
+          "version": "8.2.0",
+          "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+          "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA=="
         }
       }
     },
@@ -12294,11 +11951,6 @@
       "dev": true,
       "requires": {}
     },
-    "acorn-walk": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
-      "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
-    },
     "agent-base": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -12697,11 +12349,6 @@
         "through2": "^2.0.0"
       }
     },
-    "browser-process-hrtime": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
-      "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow=="
-    },
     "browserslist": {
       "version": "4.21.4",
       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
@@ -13201,18 +12848,23 @@
       }
     },
     "cssom": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-      "optional": true
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+      "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="
     },
     "cssstyle": {
-      "version": "0.2.37",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
-      "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==",
-      "optional": true,
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
       "requires": {
-        "cssom": "0.3.x"
+        "cssom": "~0.3.6"
+      },
+      "dependencies": {
+        "cssom": {
+          "version": "0.3.8",
+          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+          "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
+        }
       }
     },
     "csstype": {
@@ -13249,616 +12901,151 @@
         "d3-scale": "4",
         "d3-scale-chromatic": "3",
         "d3-selection": "3",
-        "d3-shape": "3",
-        "d3-time": "3",
-        "d3-time-format": "4",
-        "d3-timer": "3",
-        "d3-transition": "3",
-        "d3-zoom": "3"
-      }
-    },
-    "d3-array": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz",
-      "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==",
-      "requires": {
-        "internmap": "1 - 2"
-      }
-    },
-    "d3-axis": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
-      "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="
-    },
-    "d3-brush": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
-      "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
-      "requires": {
-        "d3-dispatch": "1 - 3",
-        "d3-drag": "2 - 3",
-        "d3-interpolate": "1 - 3",
-        "d3-selection": "3",
-        "d3-transition": "3"
-      }
-    },
-    "d3-chord": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
-      "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
-      "requires": {
-        "d3-path": "1 - 3"
-      }
-    },
-    "d3-collection": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz",
-      "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
-    },
-    "d3-color": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
-      "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
-    },
-    "d3-contour": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.0.tgz",
-      "integrity": "sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw==",
-      "requires": {
-        "d3-array": "^3.2.0"
-      }
-    },
-    "d3-delaunay": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz",
-      "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==",
-      "requires": {
-        "delaunator": "5"
-      }
-    },
-    "d3-dispatch": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
-      "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="
-    },
-    "d3-drag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
-      "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
-      "requires": {
-        "d3-dispatch": "1 - 3",
-        "d3-selection": "3"
-      }
-    },
-    "d3-dsv": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
-      "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
-      "requires": {
-        "commander": "7",
-        "iconv-lite": "0.6",
-        "rw": "1"
-      },
-      "dependencies": {
-        "iconv-lite": {
-          "version": "0.6.3",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3.0.0"
-          }
-        }
-      }
-    },
-    "d3-ease": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
-      "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
-    },
-    "d3-fetch": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
-      "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
-      "requires": {
-        "d3-dsv": "1 - 3"
-      }
-    },
-    "d3-force": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
-      "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
-      "requires": {
-        "d3-dispatch": "1 - 3",
-        "d3-quadtree": "1 - 3",
-        "d3-timer": "1 - 3"
-      }
-    },
-    "d3-format": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
-      "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
-    },
-    "d3-geo": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz",
-      "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==",
-      "requires": {
-        "d3-array": "2.5.0 - 3"
-      }
-    },
-    "d3-hierarchy": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
-      "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="
-    },
-    "d3-interpolate": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
-      "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
-      "requires": {
-        "d3-color": "1 - 3"
-      }
-    },
-    "d3-node": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-node/-/d3-node-3.0.0.tgz",
-      "integrity": "sha512-JuuBToljSQBo+KHSuPVOEdKawsxuLDlrB8TZY8AkPkpvyKaGgX+g0ksgjRg+Mgat9fB77qFQrk09j72cD0yk7w==",
-      "requires": {
-        "d3": "^5.16.0",
-        "jsdom": "^16.7.0"
-      },
-      "dependencies": {
-        "abab": {
-          "version": "2.0.6",
-          "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
-          "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
-        },
-        "acorn-globals": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz",
-          "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==",
-          "requires": {
-            "acorn": "^7.1.1",
-            "acorn-walk": "^7.1.1"
-          },
-          "dependencies": {
-            "acorn": {
-              "version": "7.4.1",
-              "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-              "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A=="
-            }
-          }
-        },
-        "commander": {
-          "version": "2.20.3",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
-          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
-        },
-        "cssom": {
-          "version": "0.4.4",
-          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
-          "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw=="
-        },
-        "cssstyle": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
-          "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
-          "requires": {
-            "cssom": "~0.3.6"
-          },
-          "dependencies": {
-            "cssom": {
-              "version": "0.3.8",
-              "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-              "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
-            }
-          }
-        },
-        "d3": {
-          "version": "5.16.0",
-          "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz",
-          "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==",
-          "requires": {
-            "d3-array": "1",
-            "d3-axis": "1",
-            "d3-brush": "1",
-            "d3-chord": "1",
-            "d3-collection": "1",
-            "d3-color": "1",
-            "d3-contour": "1",
-            "d3-dispatch": "1",
-            "d3-drag": "1",
-            "d3-dsv": "1",
-            "d3-ease": "1",
-            "d3-fetch": "1",
-            "d3-force": "1",
-            "d3-format": "1",
-            "d3-geo": "1",
-            "d3-hierarchy": "1",
-            "d3-interpolate": "1",
-            "d3-path": "1",
-            "d3-polygon": "1",
-            "d3-quadtree": "1",
-            "d3-random": "1",
-            "d3-scale": "2",
-            "d3-scale-chromatic": "1",
-            "d3-selection": "1",
-            "d3-shape": "1",
-            "d3-time": "1",
-            "d3-time-format": "2",
-            "d3-timer": "1",
-            "d3-transition": "1",
-            "d3-voronoi": "1",
-            "d3-zoom": "1"
-          }
-        },
-        "d3-array": {
-          "version": "1.2.4",
-          "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
-          "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
-        },
-        "d3-axis": {
-          "version": "1.0.12",
-          "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.12.tgz",
-          "integrity": "sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ=="
-        },
-        "d3-brush": {
-          "version": "1.1.6",
-          "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.1.6.tgz",
-          "integrity": "sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA==",
-          "requires": {
-            "d3-dispatch": "1",
-            "d3-drag": "1",
-            "d3-interpolate": "1",
-            "d3-selection": "1",
-            "d3-transition": "1"
-          }
-        },
-        "d3-chord": {
-          "version": "1.0.6",
-          "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz",
-          "integrity": "sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA==",
-          "requires": {
-            "d3-array": "1",
-            "d3-path": "1"
-          }
-        },
-        "d3-color": {
-          "version": "1.4.1",
-          "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz",
-          "integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
-        },
-        "d3-contour": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz",
-          "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==",
-          "requires": {
-            "d3-array": "^1.1.1"
-          }
-        },
-        "d3-dispatch": {
-          "version": "1.0.6",
-          "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
-          "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA=="
-        },
-        "d3-drag": {
-          "version": "1.2.5",
-          "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.5.tgz",
-          "integrity": "sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w==",
-          "requires": {
-            "d3-dispatch": "1",
-            "d3-selection": "1"
-          }
-        },
-        "d3-dsv": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz",
-          "integrity": "sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g==",
-          "requires": {
-            "commander": "2",
-            "iconv-lite": "0.4",
-            "rw": "1"
-          }
-        },
-        "d3-ease": {
-          "version": "1.0.7",
-          "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.7.tgz",
-          "integrity": "sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ=="
-        },
-        "d3-fetch": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz",
-          "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==",
-          "requires": {
-            "d3-dsv": "1"
-          }
-        },
-        "d3-force": {
-          "version": "1.2.1",
-          "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz",
-          "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==",
-          "requires": {
-            "d3-collection": "1",
-            "d3-dispatch": "1",
-            "d3-quadtree": "1",
-            "d3-timer": "1"
-          }
-        },
-        "d3-format": {
-          "version": "1.4.5",
-          "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz",
-          "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ=="
-        },
-        "d3-geo": {
-          "version": "1.12.1",
-          "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz",
-          "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==",
-          "requires": {
-            "d3-array": "1"
-          }
-        },
-        "d3-hierarchy": {
-          "version": "1.1.9",
-          "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz",
-          "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ=="
-        },
-        "d3-interpolate": {
-          "version": "1.4.0",
-          "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz",
-          "integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==",
-          "requires": {
-            "d3-color": "1"
-          }
-        },
-        "d3-path": {
-          "version": "1.0.9",
-          "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
-          "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
-        },
-        "d3-polygon": {
-          "version": "1.0.6",
-          "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.6.tgz",
-          "integrity": "sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ=="
-        },
-        "d3-quadtree": {
-          "version": "1.0.7",
-          "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
-          "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA=="
-        },
-        "d3-random": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.2.tgz",
-          "integrity": "sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ=="
-        },
-        "d3-scale": {
-          "version": "2.2.2",
-          "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
-          "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==",
-          "requires": {
-            "d3-array": "^1.2.0",
-            "d3-collection": "1",
-            "d3-format": "1",
-            "d3-interpolate": "1",
-            "d3-time": "1",
-            "d3-time-format": "2"
-          }
-        },
-        "d3-scale-chromatic": {
-          "version": "1.5.0",
-          "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz",
-          "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==",
-          "requires": {
-            "d3-color": "1",
-            "d3-interpolate": "1"
-          }
-        },
-        "d3-selection": {
-          "version": "1.4.2",
-          "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz",
-          "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg=="
-        },
-        "d3-shape": {
-          "version": "1.3.7",
-          "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
-          "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
-          "requires": {
-            "d3-path": "1"
-          }
-        },
-        "d3-time": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
-          "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
-        },
-        "d3-time-format": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz",
-          "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==",
-          "requires": {
-            "d3-time": "1"
-          }
-        },
-        "d3-timer": {
-          "version": "1.0.10",
-          "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz",
-          "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw=="
-        },
-        "d3-transition": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.3.2.tgz",
-          "integrity": "sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA==",
-          "requires": {
-            "d3-color": "1",
-            "d3-dispatch": "1",
-            "d3-ease": "1",
-            "d3-interpolate": "1",
-            "d3-selection": "^1.1.0",
-            "d3-timer": "1"
-          }
-        },
-        "d3-zoom": {
-          "version": "1.8.3",
-          "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.8.3.tgz",
-          "integrity": "sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ==",
-          "requires": {
-            "d3-dispatch": "1",
-            "d3-drag": "1",
-            "d3-interpolate": "1",
-            "d3-selection": "1",
-            "d3-transition": "1"
-          }
-        },
-        "escodegen": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
-          "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
-          "requires": {
-            "esprima": "^4.0.1",
-            "estraverse": "^5.2.0",
-            "esutils": "^2.0.2",
-            "optionator": "^0.8.1",
-            "source-map": "~0.6.1"
-          }
-        },
-        "form-data": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz",
-          "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==",
-          "requires": {
-            "asynckit": "^0.4.0",
-            "combined-stream": "^1.0.8",
-            "mime-types": "^2.1.12"
-          }
-        },
-        "html-encoding-sniffer": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz",
-          "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==",
-          "requires": {
-            "whatwg-encoding": "^1.0.5"
-          }
-        },
-        "jsdom": {
-          "version": "16.7.0",
-          "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz",
-          "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==",
-          "requires": {
-            "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"
-          }
-        },
-        "levn": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-          "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-          "requires": {
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2"
-          }
-        },
-        "optionator": {
-          "version": "0.8.3",
-          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-          "requires": {
-            "deep-is": "~0.1.3",
-            "fast-levenshtein": "~2.0.6",
-            "levn": "~0.3.0",
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2",
-            "word-wrap": "~1.2.3"
-          }
-        },
-        "parse5": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
-          "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
-        },
-        "prelude-ls": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-          "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w=="
-        },
-        "tough-cookie": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
-          "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
-          "requires": {
-            "psl": "^1.1.33",
-            "punycode": "^2.1.1",
-            "universalify": "^0.2.0",
-            "url-parse": "^1.5.3"
-          }
-        },
-        "tr46": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
-          "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
-          "requires": {
-            "punycode": "^2.1.1"
-          }
-        },
-        "type-check": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-          "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-          "requires": {
-            "prelude-ls": "~1.1.2"
-          }
-        },
-        "webidl-conversions": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-          "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
-        },
-        "whatwg-url": {
-          "version": "8.7.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
-          "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+        "d3-shape": "3",
+        "d3-time": "3",
+        "d3-time-format": "4",
+        "d3-timer": "3",
+        "d3-transition": "3",
+        "d3-zoom": "3"
+      }
+    },
+    "d3-array": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz",
+      "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==",
+      "requires": {
+        "internmap": "1 - 2"
+      }
+    },
+    "d3-axis": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
+      "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="
+    },
+    "d3-brush": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
+      "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
+      "requires": {
+        "d3-dispatch": "1 - 3",
+        "d3-drag": "2 - 3",
+        "d3-interpolate": "1 - 3",
+        "d3-selection": "3",
+        "d3-transition": "3"
+      }
+    },
+    "d3-chord": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
+      "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
+      "requires": {
+        "d3-path": "1 - 3"
+      }
+    },
+    "d3-color": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
+      "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
+    },
+    "d3-contour": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.0.tgz",
+      "integrity": "sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw==",
+      "requires": {
+        "d3-array": "^3.2.0"
+      }
+    },
+    "d3-delaunay": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz",
+      "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==",
+      "requires": {
+        "delaunator": "5"
+      }
+    },
+    "d3-dispatch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
+      "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="
+    },
+    "d3-drag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
+      "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
+      "requires": {
+        "d3-dispatch": "1 - 3",
+        "d3-selection": "3"
+      }
+    },
+    "d3-dsv": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
+      "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
+      "requires": {
+        "commander": "7",
+        "iconv-lite": "0.6",
+        "rw": "1"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.6.3",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
           "requires": {
-            "lodash": "^4.7.0",
-            "tr46": "^2.1.0",
-            "webidl-conversions": "^6.1.0"
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
           }
-        },
-        "ws": {
-          "version": "7.5.9",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
-          "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
-          "requires": {}
-        },
-        "xml-name-validator": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
-          "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
         }
       }
     },
+    "d3-ease": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
+      "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
+    },
+    "d3-fetch": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
+      "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
+      "requires": {
+        "d3-dsv": "1 - 3"
+      }
+    },
+    "d3-force": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
+      "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
+      "requires": {
+        "d3-dispatch": "1 - 3",
+        "d3-quadtree": "1 - 3",
+        "d3-timer": "1 - 3"
+      }
+    },
+    "d3-format": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
+      "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
+    },
+    "d3-geo": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz",
+      "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==",
+      "requires": {
+        "d3-array": "2.5.0 - 3"
+      }
+    },
+    "d3-hierarchy": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
+      "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="
+    },
+    "d3-interpolate": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
+      "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
+      "requires": {
+        "d3-color": "1 - 3"
+      }
+    },
     "d3-path": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz",
@@ -13946,11 +13133,6 @@
         "d3-timer": "1 - 3"
       }
     },
-    "d3-voronoi": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz",
-      "integrity": "sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg=="
-    },
     "d3-zoom": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
@@ -13977,46 +13159,6 @@
       "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
       "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
     },
-    "data-urls": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz",
-      "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==",
-      "requires": {
-        "abab": "^2.0.3",
-        "whatwg-mimetype": "^2.3.0",
-        "whatwg-url": "^8.0.0"
-      },
-      "dependencies": {
-        "abab": {
-          "version": "2.0.6",
-          "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
-          "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
-        },
-        "tr46": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
-          "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
-          "requires": {
-            "punycode": "^2.1.1"
-          }
-        },
-        "webidl-conversions": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-          "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w=="
-        },
-        "whatwg-url": {
-          "version": "8.7.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
-          "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
-          "requires": {
-            "lodash": "^4.7.0",
-            "tr46": "^2.1.0",
-            "webidl-conversions": "^6.1.0"
-          }
-        }
-      }
-    },
     "debug": {
       "version": "2.6.9",
       "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
@@ -14026,9 +13168,9 @@
       }
     },
     "decimal.js": {
-      "version": "10.4.1",
-      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.1.tgz",
-      "integrity": "sha512-F29o+vci4DodHYT9UrR5IEbfBw9pE5eSapIJdTqXK5+6hq+t8VRxwQyKlW2i+KDKFkkJQRvFyI/QXD83h8LyQw=="
+      "version": "10.4.3",
+      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
     },
     "decode-uri-component": {
       "version": "0.2.2",
@@ -14169,21 +13311,6 @@
       "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
       "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
     },
-    "domexception": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz",
-      "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==",
-      "requires": {
-        "webidl-conversions": "^5.0.0"
-      },
-      "dependencies": {
-        "webidl-conversions": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
-          "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
-        }
-      }
-    },
     "domhandler": {
       "version": "5.0.3",
       "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
@@ -15155,12 +14282,29 @@
       "devOptional": true
     },
     "html-encoding-sniffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
-      "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
-      "optional": true,
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+      "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
       "requires": {
-        "whatwg-encoding": "^1.0.1"
+        "whatwg-encoding": "^2.0.0"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.6.3",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
+          }
+        },
+        "whatwg-encoding": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+          "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+          "requires": {
+            "iconv-lite": "0.6.3"
+          }
+        }
       }
     },
     "html-escaper": {
@@ -15204,31 +14348,6 @@
         "toidentifier": "1.0.1"
       }
     },
-    "http-proxy-agent": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
-      "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
-      "requires": {
-        "@tootallnate/once": "1",
-        "agent-base": "6",
-        "debug": "4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        }
-      }
-    },
     "http-signature": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -16017,56 +15136,186 @@
     },
     "js-yaml": {
       "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "requires": {
-        "argparse": "^2.0.1"
-      }
-    },
-    "jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
-      "optional": true
-    },
-    "jsdom": {
-      "version": "9.12.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz",
-      "integrity": "sha512-Qw4oqNxo4LyzkSqVIyCnEltTc4xV3g1GBaI88AvYTesWzmWHUSoMNmhBjUBa+6ldXIBJS9xoeLNJPfUAykTyxw==",
-      "optional": true,
-      "requires": {
-        "abab": "^1.0.3",
-        "acorn": "^4.0.4",
-        "acorn-globals": "^3.1.0",
-        "array-equal": "^1.0.0",
-        "content-type-parser": "^1.0.1",
-        "cssom": ">= 0.3.2 < 0.4.0",
-        "cssstyle": ">= 0.2.37 < 0.3.0",
-        "escodegen": "^1.6.1",
-        "html-encoding-sniffer": "^1.0.1",
-        "nwmatcher": ">= 1.3.9 < 2.0.0",
-        "parse5": "^1.5.1",
-        "request": "^2.79.0",
-        "sax": "^1.2.1",
-        "symbol-tree": "^3.2.1",
-        "tough-cookie": "^2.3.2",
-        "webidl-conversions": "^4.0.0",
-        "whatwg-encoding": "^1.0.1",
-        "whatwg-url": "^4.3.0",
-        "xml-name-validator": "^2.0.1"
+      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+      "requires": {
+        "argparse": "^2.0.1"
+      }
+    },
+    "jsbn": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
+      "optional": true
+    },
+    "jsdom": {
+      "version": "20.0.3",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
+      "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+      "requires": {
+        "abab": "^2.0.6",
+        "acorn": "^8.8.1",
+        "acorn-globals": "^7.0.0",
+        "cssom": "^0.5.0",
+        "cssstyle": "^2.3.0",
+        "data-urls": "^3.0.2",
+        "decimal.js": "^10.4.2",
+        "domexception": "^4.0.0",
+        "escodegen": "^2.0.0",
+        "form-data": "^4.0.0",
+        "html-encoding-sniffer": "^3.0.0",
+        "http-proxy-agent": "^5.0.0",
+        "https-proxy-agent": "^5.0.1",
+        "is-potential-custom-element-name": "^1.0.1",
+        "nwsapi": "^2.2.2",
+        "parse5": "^7.1.1",
+        "saxes": "^6.0.0",
+        "symbol-tree": "^3.2.4",
+        "tough-cookie": "^4.1.2",
+        "w3c-xmlserializer": "^4.0.0",
+        "webidl-conversions": "^7.0.0",
+        "whatwg-encoding": "^2.0.0",
+        "whatwg-mimetype": "^3.0.0",
+        "whatwg-url": "^11.0.0",
+        "ws": "^8.11.0",
+        "xml-name-validator": "^4.0.0"
       },
       "dependencies": {
-        "acorn": {
-          "version": "4.0.13",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
-          "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==",
-          "optional": true
+        "@tootallnate/once": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+          "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="
         },
-        "parse5": {
-          "version": "1.5.1",
-          "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
-          "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==",
-          "optional": true
+        "data-urls": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+          "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+          "requires": {
+            "abab": "^2.0.6",
+            "whatwg-mimetype": "^3.0.0",
+            "whatwg-url": "^11.0.0"
+          }
+        },
+        "debug": {
+          "version": "4.3.4",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "domexception": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+          "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+          "requires": {
+            "webidl-conversions": "^7.0.0"
+          }
+        },
+        "escodegen": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+          "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+          "requires": {
+            "esprima": "^4.0.1",
+            "estraverse": "^5.2.0",
+            "esutils": "^2.0.2",
+            "optionator": "^0.8.1",
+            "source-map": "~0.6.1"
+          }
+        },
+        "http-proxy-agent": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+          "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+          "requires": {
+            "@tootallnate/once": "2",
+            "agent-base": "6",
+            "debug": "4"
+          }
+        },
+        "iconv-lite": {
+          "version": "0.6.3",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+          "requires": {
+            "safer-buffer": ">= 2.1.2 < 3.0.0"
+          }
+        },
+        "levn": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+          "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+          "requires": {
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "optionator": {
+          "version": "0.8.3",
+          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+          "requires": {
+            "deep-is": "~0.1.3",
+            "fast-levenshtein": "~2.0.6",
+            "levn": "~0.3.0",
+            "prelude-ls": "~1.1.2",
+            "type-check": "~0.3.2",
+            "word-wrap": "~1.2.3"
+          }
+        },
+        "prelude-ls": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+          "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w=="
+        },
+        "saxes": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+          "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+          "requires": {
+            "xmlchars": "^2.2.0"
+          }
+        },
+        "type-check": {
+          "version": "0.3.2",
+          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+          "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+          "requires": {
+            "prelude-ls": "~1.1.2"
+          }
+        },
+        "w3c-xmlserializer": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
+          "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
+          "requires": {
+            "xml-name-validator": "^4.0.0"
+          }
+        },
+        "whatwg-encoding": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+          "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+          "requires": {
+            "iconv-lite": "0.6.3"
+          }
+        },
+        "whatwg-mimetype": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+          "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="
+        },
+        "ws": {
+          "version": "8.11.0",
+          "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+          "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
+          "requires": {}
         }
       }
     },
@@ -16205,11 +15454,6 @@
         "p-locate": "^4.1.0"
       }
     },
-    "lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
-    },
     "lodash.merge": {
       "version": "4.6.2",
       "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -16480,6 +15724,126 @@
         "promisify-node": "^0.2.1",
         "ramda": "^0.18.0",
         "underscore.string": "^3.3.4"
+      },
+      "dependencies": {
+        "abab": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
+          "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==",
+          "optional": true
+        },
+        "acorn": {
+          "version": "4.0.13",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+          "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==",
+          "optional": true
+        },
+        "acorn-globals": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
+          "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==",
+          "optional": true,
+          "requires": {
+            "acorn": "^4.0.4"
+          }
+        },
+        "cssom": {
+          "version": "0.3.8",
+          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+          "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+          "optional": true
+        },
+        "cssstyle": {
+          "version": "0.2.37",
+          "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
+          "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==",
+          "optional": true,
+          "requires": {
+            "cssom": "0.3.x"
+          }
+        },
+        "html-encoding-sniffer": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
+          "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
+          "optional": true,
+          "requires": {
+            "whatwg-encoding": "^1.0.1"
+          }
+        },
+        "jsdom": {
+          "version": "9.12.0",
+          "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz",
+          "integrity": "sha512-Qw4oqNxo4LyzkSqVIyCnEltTc4xV3g1GBaI88AvYTesWzmWHUSoMNmhBjUBa+6ldXIBJS9xoeLNJPfUAykTyxw==",
+          "optional": true,
+          "requires": {
+            "abab": "^1.0.3",
+            "acorn": "^4.0.4",
+            "acorn-globals": "^3.1.0",
+            "array-equal": "^1.0.0",
+            "content-type-parser": "^1.0.1",
+            "cssom": ">= 0.3.2 < 0.4.0",
+            "cssstyle": ">= 0.2.37 < 0.3.0",
+            "escodegen": "^1.6.1",
+            "html-encoding-sniffer": "^1.0.1",
+            "nwmatcher": ">= 1.3.9 < 2.0.0",
+            "parse5": "^1.5.1",
+            "request": "^2.79.0",
+            "sax": "^1.2.1",
+            "symbol-tree": "^3.2.1",
+            "tough-cookie": "^2.3.2",
+            "webidl-conversions": "^4.0.0",
+            "whatwg-encoding": "^1.0.1",
+            "whatwg-url": "^4.3.0",
+            "xml-name-validator": "^2.0.1"
+          }
+        },
+        "parse5": {
+          "version": "1.5.1",
+          "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+          "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==",
+          "optional": true
+        },
+        "tough-cookie": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+          "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+          "optional": true,
+          "requires": {
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
+        },
+        "webidl-conversions": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
+          "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
+          "optional": true
+        },
+        "whatwg-url": {
+          "version": "4.8.0",
+          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz",
+          "integrity": "sha512-nUvUPuenPFtPfy/X+dAYh/TfRbTBlnXTM5iIfLseJFkkQewmpG9pGR6i87E9qL+lZaJzv+99kkQWoGOtLfkZQQ==",
+          "optional": true,
+          "requires": {
+            "tr46": "~0.0.3",
+            "webidl-conversions": "^3.0.0"
+          },
+          "dependencies": {
+            "webidl-conversions": {
+              "version": "3.0.1",
+              "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+              "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+              "optional": true
+            }
+          }
+        },
+        "xml-name-validator": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
+          "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==",
+          "optional": true
+        }
       }
     },
     "node-domexception": {
@@ -17252,6 +16616,16 @@
           "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
           "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
           "optional": true
+        },
+        "tough-cookie": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+          "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+          "optional": true,
+          "requires": {
+            "psl": "^1.1.28",
+            "punycode": "^2.1.1"
+          }
         }
       }
     },
@@ -17421,14 +16795,6 @@
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
     },
-    "saxes": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz",
-      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
-      "requires": {
-        "xmlchars": "^2.2.0"
-      }
-    },
     "select": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
@@ -18070,13 +17436,14 @@
       }
     },
     "tough-cookie": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-      "optional": true,
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
+      "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
       "requires": {
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
+        "psl": "^1.1.33",
+        "punycode": "^2.1.1",
+        "universalify": "^0.2.0",
+        "url-parse": "^1.5.3"
       }
     },
     "tr46": {
@@ -18282,29 +17649,6 @@
       "resolved": "https://registry.npmjs.org/vue-prism-component/-/vue-prism-component-1.2.0.tgz",
       "integrity": "sha512-0N9CNuQu+36CJpdsZHrhdq7d18oBvjVMjawyKdIr8xuzFWLfdxECZQYbFaYoopPBg3SvkEEMtkhYqdgTQl5Y+A=="
     },
-    "w3c-hr-time": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
-      "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
-      "requires": {
-        "browser-process-hrtime": "^1.0.0"
-      }
-    },
-    "w3c-xmlserializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz",
-      "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==",
-      "requires": {
-        "xml-name-validator": "^3.0.0"
-      },
-      "dependencies": {
-        "xml-name-validator": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
-          "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw=="
-        }
-      }
-    },
     "walker": {
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
@@ -18320,39 +17664,35 @@
       "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q=="
     },
     "webidl-conversions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
-      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
-      "optional": true
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+      "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
     },
     "whatwg-encoding": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
       "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+      "optional": true,
       "requires": {
         "iconv-lite": "0.4.24"
       }
     },
-    "whatwg-mimetype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
-      "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g=="
-    },
     "whatwg-url": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz",
-      "integrity": "sha512-nUvUPuenPFtPfy/X+dAYh/TfRbTBlnXTM5iIfLseJFkkQewmpG9pGR6i87E9qL+lZaJzv+99kkQWoGOtLfkZQQ==",
-      "optional": true,
+      "version": "11.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+      "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
       "requires": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
+        "tr46": "^3.0.0",
+        "webidl-conversions": "^7.0.0"
       },
       "dependencies": {
-        "webidl-conversions": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-          "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
-          "optional": true
+        "tr46": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+          "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+          "requires": {
+            "punycode": "^2.1.1"
+          }
         }
       }
     },
@@ -18426,10 +17766,9 @@
       }
     },
     "xml-name-validator": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
-      "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==",
-      "optional": true
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+      "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="
     },
     "xml-parser-xo": {
       "version": "4.0.1",
diff --git a/package.json b/package.json
index 7b4ed56c7eb..c76d4d7d5cf 100644
--- a/package.json
+++ b/package.json
@@ -41,13 +41,13 @@
     "compression": "^1.7.4",
     "csso": "^5.0.5",
     "d3": "^7.8.0",
-    "d3-node": "^3.0.0",
     "ejs": "^3.1.8",
     "emoji-name-map": "^1.2.9",
     "express": "^4.18.2",
     "express-rate-limit": "^6.7.0",
     "file-type": "^18.2.0",
     "js-yaml": "^4.1.0",
+    "jsdom": "^20.0.3",
     "linguist-js": "^2.5.3",
     "marked": "^4.2.5",
     "memory-cache": "^0.2.0",
diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 2e741e0380a..39409439e43 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -4,8 +4,8 @@ import axios from "axios"
 import processes from "child_process"
 import crypto from "crypto"
 import { minify as csso } from "csso"
+import { JSDOM } from "jsdom"
 import * as d3 from "d3"
-import D3node from "d3-node"
 import emoji from "emoji-name-map"
 import { fileTypeFromBuffer } from "file-type"
 import fss from "fs"
@@ -34,7 +34,7 @@ import xmlformat from "xml-formatter"
 prism_lang()
 
 //Exports
-export { axios, d3, D3node, emoji, fetch, fs, git, minimatch, opengraph, os, paths, processes, sharp, url, util }
+export { axios, d3, emoji, fetch, fs, git, minimatch, opengraph, os, paths, processes, sharp, url, util }
 
 /**Returns module __dirname */
 export function __module(module) {
@@ -790,3 +790,26 @@ export async function gif({page, width, height, frames, x = 0, y = 0, repeat = t
   await fs.unlink(path)
   return `data:image/gif;base64,${result}`
 }
+
+/**D3 node wrapper (loosely based on https://github.com/d3-node/d3-node)*/
+export class D3node {
+  constructor() {
+    this.jsdom = new JSDOM()
+    this.document = this.jsdom.window.document
+  }
+
+  get element() {
+    return d3.select(this.document.body)
+  }
+
+  createSVG(width, height) {
+    const svg = this.element.append("svg").attr("xmlns", "http://www.w3.org/2000/svg")
+    if ((width)&&(height))
+      svg.attr("width", width).attr("height", height)
+    return svg
+  }
+
+  svgString() {
+    return this.element.select("svg").node()?.outerHTML || ""
+  }
+}
\ No newline at end of file
diff --git a/source/plugins/stargazers/worldmap/index.mjs b/source/plugins/stargazers/worldmap/index.mjs
index c669e3875a1..0de86e2e836 100644
--- a/source/plugins/stargazers/worldmap/index.mjs
+++ b/source/plugins/stargazers/worldmap/index.mjs
@@ -2,7 +2,7 @@
 import { Client as Gmap } from "@googlemaps/google-maps-services-js"
 import color from "color"
 import * as d3 from "d3"
-import D3Node from "d3-node"
+import {D3node} from "../../../app/metrics/utils.mjs"
 
 /**
  * Worldmap
@@ -38,7 +38,7 @@ export default async function(login, {locations, sample, imports, token}) {
   }
 
   //Generate SVG
-  const d3n = new D3Node()
+  const d3n = new D3node()
   const svg = d3n.createSVG(480, 315)
   const countries = JSON.parse(await imports.fs.readFile(imports.paths.join(imports.__module(import.meta.url), "atlas/50m_countries.geojson")))
   const geopath = d3.geoPath(d3.geoMercator().fitWidth(svg.attr("width"), countries))

From d418264c77a7a4b1b4958f9ad82acf38442a29f8 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 16 Jan 2023 20:12:56 -0500
Subject: [PATCH 057/196] fix(deps): switch from twemoji-parser to
 @twemoji/parser (#1355) [skip ci]

---
 package-lock.json            | 22 +++++++++++-----------
 package.json                 |  2 +-
 source/app/metrics/utils.mjs |  2 +-
 3 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6d3ad008f9f..160cc079b3d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,7 @@
         "@octokit/rest": "^19.0.5",
         "@primer/css": "^20.8.0",
         "@primer/octicons": "^17.10.1",
+        "@twemoji/parser": "^14.1.0",
         "axios": "^1.1.3",
         "clipboard": "^2.0.11",
         "compression": "^1.7.4",
@@ -44,7 +45,6 @@
         "sharp": "^0.31.3",
         "simple-git": "^3.16.0",
         "svgo": "^3.0.2",
-        "twemoji-parser": "^14.0.0",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
         "xml-formatter": "^3.2.0"
@@ -2070,6 +2070,11 @@
         "node": ">=10.13.0"
       }
     },
+    "node_modules/@twemoji/parser": {
+      "version": "14.1.0",
+      "resolved": "https://registry.npmjs.org/@twemoji/parser/-/parser-14.1.0.tgz",
+      "integrity": "sha512-psQR5WEZjqSFy1gxJKpiMR9ygy59jykqIAAON8Xir78t9+E4z6S/BwYsksbylzJB1nCHKLzvkROrUHk2DKnEbg=="
+    },
     "node_modules/@types/babel__core": {
       "version": "7.1.20",
       "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
@@ -9638,11 +9643,6 @@
       "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
       "optional": true
     },
-    "node_modules/twemoji-parser": {
-      "version": "14.0.0",
-      "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-14.0.0.tgz",
-      "integrity": "sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA=="
-    },
     "node_modules/type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -11772,6 +11772,11 @@
       "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
       "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="
     },
+    "@twemoji/parser": {
+      "version": "14.1.0",
+      "resolved": "https://registry.npmjs.org/@twemoji/parser/-/parser-14.1.0.tgz",
+      "integrity": "sha512-psQR5WEZjqSFy1gxJKpiMR9ygy59jykqIAAON8Xir78t9+E4z6S/BwYsksbylzJB1nCHKLzvkROrUHk2DKnEbg=="
+    },
     "@types/babel__core": {
       "version": "7.1.20",
       "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
@@ -17470,11 +17475,6 @@
       "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
       "optional": true
     },
-    "twemoji-parser": {
-      "version": "14.0.0",
-      "resolved": "https://registry.npmjs.org/twemoji-parser/-/twemoji-parser-14.0.0.tgz",
-      "integrity": "sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA=="
-    },
     "type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
diff --git a/package.json b/package.json
index c76d4d7d5cf..5500cb554f5 100644
--- a/package.json
+++ b/package.json
@@ -36,6 +36,7 @@
     "@octokit/rest": "^19.0.5",
     "@primer/css": "^20.8.0",
     "@primer/octicons": "^17.10.1",
+    "@twemoji/parser": "^14.1.0",
     "axios": "^1.1.3",
     "clipboard": "^2.0.11",
     "compression": "^1.7.4",
@@ -63,7 +64,6 @@
     "sharp": "^0.31.3",
     "simple-git": "^3.16.0",
     "svgo": "^3.0.2",
-    "twemoji-parser": "^14.0.0",
     "vue": "^2.7.1",
     "vue-prism-component": "^1.2.0",
     "xml-formatter": "^3.2.0"
diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 39409439e43..daefeadc59a 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -27,7 +27,7 @@ import htmlsanitize from "sanitize-html"
 import sharp from "sharp"
 import git from "simple-git"
 import SVGO from "svgo"
-import twemojis from "twemoji-parser"
+import twemojis from "@twemoji/parser"
 import url from "url"
 import util from "util"
 import xmlformat from "xml-formatter"

From e015fac11613b14373a724317583b5a54fc39c28 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 16 Jan 2023 20:13:05 -0500
Subject: [PATCH 058/196] fix(plugins/lines): add support for organization
 history (#1356)

---
 source/plugins/base/queries/repositories.graphql | 1 +
 source/plugins/lines/index.mjs                   | 9 ++++++---
 2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/source/plugins/base/queries/repositories.graphql b/source/plugins/base/queries/repositories.graphql
index d5b25973ac6..d0af25ad485 100644
--- a/source/plugins/base/queries/repositories.graphql
+++ b/source/plugins/base/queries/repositories.graphql
@@ -5,6 +5,7 @@ query BaseRepositories {
         cursor
       }
       nodes {
+        updatedAt
         name
         owner {
           login
diff --git a/source/plugins/lines/index.mjs b/source/plugins/lines/index.mjs
index c785477acb9..e8ec75a715b 100644
--- a/source/plugins/lines/index.mjs
+++ b/source/plugins/lines/index.mjs
@@ -12,13 +12,16 @@ export default async function({login, data, imports, rest, q, account}, {enabled
 
     //Context
     let context = {mode: "user"}
-    if (q.repo) {
+    if (data.account) {
+      context = {...context, mode: "organization"}
+    }
+    else if (q.repo) {
       console.debug(`metrics/compute/${login}/plugins > people > switched to repository mode`)
       context = {...context, mode: "repository"}
     }
 
     //Repositories
-    const repositories = data.user.repositories.nodes.map(({name: repo, owner: {login: owner}}) => ({repo, owner})) ?? []
+    const repositories = data.user.repositories.nodes.map(({name: repo, owner: {login: owner}}) => ({repo, owner})).sort((a, b) => new Date(b.updatedAt) - new Date(a.updatedAt)) ?? []
 
     //Get contributors stats from repositories
     console.debug(`metrics/compute/${login}/plugins > lines > querying api`)
@@ -35,7 +38,7 @@ export default async function({login, data, imports, rest, q, account}, {enabled
         return
       //Compute changes
       repos[handle] = {added: 0, deleted: 0, changed: 0}
-      const contributors = stats.filter(({author}) => context.mode === "repository" ? true : author?.login?.toLocaleLowerCase() === login.toLocaleLowerCase())
+      const contributors = stats.filter(({author}) => (context.mode === "repository")||(context.mode === "organization") ? true : author?.login?.toLocaleLowerCase() === login.toLocaleLowerCase())
       for (const contributor of contributors) {
         let added = 0, changed = 0, deleted = 0
         contributor.weeks.forEach(({a = 0, d = 0, c = 0, w}) => {

From 26d74b64f5886fb4997e2558f0edd7de488abbb2 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 17 Jan 2023 01:49:45 +0000
Subject: [PATCH 059/196] chore: code formatting

---
 source/app/metrics/utils.mjs                 | 8 ++++----
 source/plugins/lines/index.mjs               | 5 ++---
 source/plugins/stargazers/worldmap/index.mjs | 2 +-
 3 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index daefeadc59a..ea06ddc77fd 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -1,15 +1,16 @@
 //Imports
 import octicons from "@primer/octicons"
+import twemojis from "@twemoji/parser"
 import axios from "axios"
 import processes from "child_process"
 import crypto from "crypto"
 import { minify as csso } from "csso"
-import { JSDOM } from "jsdom"
 import * as d3 from "d3"
 import emoji from "emoji-name-map"
 import { fileTypeFromBuffer } from "file-type"
 import fss from "fs"
 import fs from "fs/promises"
+import { JSDOM } from "jsdom"
 import linguist from "linguist-js"
 import { marked } from "marked"
 import minimatch from "minimatch"
@@ -27,7 +28,6 @@ import htmlsanitize from "sanitize-html"
 import sharp from "sharp"
 import git from "simple-git"
 import SVGO from "svgo"
-import twemojis from "@twemoji/parser"
 import url from "url"
 import util from "util"
 import xmlformat from "xml-formatter"
@@ -804,7 +804,7 @@ export class D3node {
 
   createSVG(width, height) {
     const svg = this.element.append("svg").attr("xmlns", "http://www.w3.org/2000/svg")
-    if ((width)&&(height))
+    if ((width) && (height))
       svg.attr("width", width).attr("height", height)
     return svg
   }
@@ -812,4 +812,4 @@ export class D3node {
   svgString() {
     return this.element.select("svg").node()?.outerHTML || ""
   }
-}
\ No newline at end of file
+}
diff --git a/source/plugins/lines/index.mjs b/source/plugins/lines/index.mjs
index e8ec75a715b..8903681db5d 100644
--- a/source/plugins/lines/index.mjs
+++ b/source/plugins/lines/index.mjs
@@ -12,9 +12,8 @@ export default async function({login, data, imports, rest, q, account}, {enabled
 
     //Context
     let context = {mode: "user"}
-    if (data.account) {
+    if (data.account)
       context = {...context, mode: "organization"}
-    }
     else if (q.repo) {
       console.debug(`metrics/compute/${login}/plugins > people > switched to repository mode`)
       context = {...context, mode: "repository"}
@@ -38,7 +37,7 @@ export default async function({login, data, imports, rest, q, account}, {enabled
         return
       //Compute changes
       repos[handle] = {added: 0, deleted: 0, changed: 0}
-      const contributors = stats.filter(({author}) => (context.mode === "repository")||(context.mode === "organization") ? true : author?.login?.toLocaleLowerCase() === login.toLocaleLowerCase())
+      const contributors = stats.filter(({author}) => (context.mode === "repository") || (context.mode === "organization") ? true : author?.login?.toLocaleLowerCase() === login.toLocaleLowerCase())
       for (const contributor of contributors) {
         let added = 0, changed = 0, deleted = 0
         contributor.weeks.forEach(({a = 0, d = 0, c = 0, w}) => {
diff --git a/source/plugins/stargazers/worldmap/index.mjs b/source/plugins/stargazers/worldmap/index.mjs
index 0de86e2e836..3a7ad590e4d 100644
--- a/source/plugins/stargazers/worldmap/index.mjs
+++ b/source/plugins/stargazers/worldmap/index.mjs
@@ -2,7 +2,7 @@
 import { Client as Gmap } from "@googlemaps/google-maps-services-js"
 import color from "color"
 import * as d3 from "d3"
-import {D3node} from "../../../app/metrics/utils.mjs"
+import { D3node } from "../../../app/metrics/utils.mjs"
 
 /**
  * Worldmap

From cdf2c03b2a8fedbdd0df1e17152b796ed79a04cf Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 16 Jan 2023 22:28:20 -0500
Subject: [PATCH 060/196] chore(deps): bump jsdom from 20.0.3 to 21.0.0 (#1357)
 [skip ci]

---
 package-lock.json | 40 +++++++---------------------------------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 34 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 160cc079b3d..8a2b38bb877 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -29,7 +29,7 @@
         "express-rate-limit": "^6.7.0",
         "file-type": "^18.2.0",
         "js-yaml": "^4.1.0",
-        "jsdom": "^20.0.3",
+        "jsdom": "^21.0.0",
         "linguist-js": "^2.5.3",
         "marked": "^4.2.5",
         "memory-cache": "^0.2.0",
@@ -6566,9 +6566,9 @@
       "optional": true
     },
     "node_modules/jsdom": {
-      "version": "20.0.3",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
-      "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+      "version": "21.0.0",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.0.0.tgz",
+      "integrity": "sha512-AIw+3ZakSUtDYvhwPwWHiZsUi3zHugpMEKlNPaurviseYoBqo0zBd3zqoUi3LPCNtPFlEP8FiW9MqCZdjb2IYA==",
       "dependencies": {
         "abab": "^2.0.6",
         "acorn": "^8.8.1",
@@ -6795,26 +6795,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/jsdom/node_modules/ws": {
-      "version": "8.11.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
-      "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "bufferutil": "^4.0.1",
-        "utf-8-validate": "^5.0.2"
-      },
-      "peerDependenciesMeta": {
-        "bufferutil": {
-          "optional": true
-        },
-        "utf-8-validate": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/jsesc": {
       "version": "2.5.2",
       "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -15154,9 +15134,9 @@
       "optional": true
     },
     "jsdom": {
-      "version": "20.0.3",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
-      "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+      "version": "21.0.0",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.0.0.tgz",
+      "integrity": "sha512-AIw+3ZakSUtDYvhwPwWHiZsUi3zHugpMEKlNPaurviseYoBqo0zBd3zqoUi3LPCNtPFlEP8FiW9MqCZdjb2IYA==",
       "requires": {
         "abab": "^2.0.6",
         "acorn": "^8.8.1",
@@ -15315,12 +15295,6 @@
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
           "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="
-        },
-        "ws": {
-          "version": "8.11.0",
-          "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
-          "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
-          "requires": {}
         }
       }
     },
diff --git a/package.json b/package.json
index 5500cb554f5..8b00294f741 100644
--- a/package.json
+++ b/package.json
@@ -48,7 +48,7 @@
     "express-rate-limit": "^6.7.0",
     "file-type": "^18.2.0",
     "js-yaml": "^4.1.0",
-    "jsdom": "^20.0.3",
+    "jsdom": "^21.0.0",
     "linguist-js": "^2.5.3",
     "marked": "^4.2.5",
     "memory-cache": "^0.2.0",

From 220deb05e311b5e3a2cba30afff097c263931929 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 16 Jan 2023 22:28:33 -0500
Subject: [PATCH 061/196] feat(plugins/sponsorships): add plugin (#1358)

---
 .github/actions/spelling/allow.txt            |  1 +
 .../app/web/statics/embed/app.placeholder.js  | 20 ++++++++
 source/plugins/sponsorships/README.md         | 12 +++++
 source/plugins/sponsorships/examples.yml      |  7 +++
 source/plugins/sponsorships/index.mjs         | 51 +++++++++++++++++++
 source/plugins/sponsorships/metadata.yml      | 41 +++++++++++++++
 .../plugins/sponsorships/queries/all.graphql  | 29 +++++++++++
 .../sponsorships/queries/sponsorships.graphql | 10 ++++
 source/templates/classic/partials/_.json      |  1 +
 .../classic/partials/sponsorships.ejs         | 40 +++++++++++++++
 source/templates/classic/style.css            | 11 ++++
 .../api/github/graphql/sponsorships.all.mjs   | 33 ++++++++++++
 .../github/graphql/sponsorships.default.mjs   | 12 +++++
 13 files changed, 268 insertions(+)
 create mode 100644 source/plugins/sponsorships/README.md
 create mode 100644 source/plugins/sponsorships/examples.yml
 create mode 100644 source/plugins/sponsorships/index.mjs
 create mode 100644 source/plugins/sponsorships/metadata.yml
 create mode 100644 source/plugins/sponsorships/queries/all.graphql
 create mode 100644 source/plugins/sponsorships/queries/sponsorships.graphql
 create mode 100644 source/templates/classic/partials/sponsorships.ejs
 create mode 100644 tests/mocks/api/github/graphql/sponsorships.all.mjs
 create mode 100644 tests/mocks/api/github/graphql/sponsorships.default.mjs

diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index 32292b8542f..bd6e6acc2df 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -1,6 +1,7 @@
 deno
 gpgarmor
 github
+githubassets
 https
 leetcode
 pgn
diff --git a/source/app/web/statics/embed/app.placeholder.js b/source/app/web/statics/embed/app.placeholder.js
index f6534eb02e9..65aa3805439 100644
--- a/source/app/web/statics/embed/app.placeholder.js
+++ b/source/app/web/statics/embed/app.placeholder.js
@@ -458,6 +458,26 @@
             },
           })
           : null),
+         //Sponsorships
+         ...(set.plugins.enabled.sponsorships
+          ? ({
+            sponsorships: {
+              sections: options["sponsorships.sections"].split(",").map(x => x.trim()),
+              amount: faker.datatype.number(1000),
+              list: new Array(2+faker.datatype.number(8)).fill(null).map(_ => ({
+                login: faker.internet.userName(),
+                avatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
+                type: "user",
+                tier: `$${faker.datatype.number(100) * 10} per month`,
+                private: false,
+                past: faker.datatype.boolean(),
+              })),
+              size: Number(options["sponsorships.size"]),
+              image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
+              started: faker.date.recent(),
+            },
+          })
+          : null),
         //Languages
         ...(set.plugins.enabled.languages
           ? ({
diff --git a/source/plugins/sponsorships/README.md b/source/plugins/sponsorships/README.md
new file mode 100644
index 00000000000..3eff2a87b38
--- /dev/null
+++ b/source/plugins/sponsorships/README.md
@@ -0,0 +1,12 @@
+<!--header-->
+<!--/header-->
+
+## ➡️ Available options
+
+<!--options-->
+<!--/options-->
+
+## ℹ️ Examples workflows
+
+<!--examples-->
+<!--/examples-->
diff --git a/source/plugins/sponsorships/examples.yml b/source/plugins/sponsorships/examples.yml
new file mode 100644
index 00000000000..d5a04ee68b4
--- /dev/null
+++ b/source/plugins/sponsorships/examples.yml
@@ -0,0 +1,7 @@
+- name: 💝 GitHub sponsorships
+  uses: lowlighter/metrics@latest
+  with:
+    filename: metrics.plugin.sponsorships.svg
+    token: ${{ secrets.METRICS_TOKEN }}
+    base: ""
+    plugin_sponsorships: yes
diff --git a/source/plugins/sponsorships/index.mjs b/source/plugins/sponsorships/index.mjs
new file mode 100644
index 00000000000..946446da1cd
--- /dev/null
+++ b/source/plugins/sponsorships/index.mjs
@@ -0,0 +1,51 @@
+//Setup
+export default async function({login, q, imports, data, graphql, queries, account}, {enabled = false, extras = false} = {}) {
+  //Plugin execution
+  try {
+    //Check if plugin is enabled and requirements are met
+    if ((!q.sponsorships) || (!imports.metadata.plugins.sponsorships.enabled(enabled, {extras})))
+      return null
+
+    //Load inputs
+    let {sections, size} = await imports.metadata.plugins.sponsorships.inputs({data, account, q})
+
+    //Query description and goal
+    let amount = NaN, image = null, started = null
+    if (sections.includes("amount")) {
+      console.debug(`metrics/compute/${login}/plugins > sponsorships > querying total amount spend`)
+      const {totalSponsorshipAmountAsSponsorInCents, sponsorshipsAsSponsor} = (await graphql(queries.sponsorships({login, account})))[account]
+      amount = totalSponsorshipAmountAsSponsorInCents/100
+      image = "https://github.githubassets.com/images/icons/emoji/hearts_around.png"
+      started = sponsorshipsAsSponsor.nodes[0]?.createdAt ? new Date(sponsorshipsAsSponsor.nodes[0]?.createdAt) : null
+    }
+    image = await imports.imgb64(image)
+
+    //Query sponsorships
+    const list = []
+    if (sections.includes("sponsorships")) {
+      console.debug(`metrics/compute/${login}/plugins > sponsorships > querying sponsorships`)
+      {
+        const fetched = []
+        let cursor = null
+        let pushed = 0
+        do {
+          console.debug(`metrics/compute/${login}/sponsorships > retrieving sponsorships after ${cursor}`)
+          const {[account]: {sponsorshipsAsSponsor: {edges, nodes}}} = await graphql(queries.sponsorships.all({login, account, after: cursor ? `after: "${cursor}"` : "", size: Math.round(size * 1.5)}))
+          cursor = edges?.[edges?.length - 1]?.cursor
+          fetched.push(...nodes)
+          pushed = nodes.length
+          console.debug(`metrics/compute/${login}/sponsorships > retrieved ${pushed} sponsorships events after ${cursor}`)
+        } while ((pushed) && (cursor))
+        list.push(...fetched.map(({sponsorable: {login, avatarUrl, url: organization = null}, tier:{name:tier}, privacyLevel:privacy, isActive:active}) => ({login, avatarUrl, type: organization ? "organization" : "user", tier, private: privacy !== "PUBLIC", past:!active})))
+      }
+      await Promise.all(list.map(async user => user.avatar = await imports.imgb64(user.avatarUrl)))
+    }
+
+    //Results
+    return {amount, list, sections, size, image, started}
+  }
+  //Handle errors
+  catch (error) {
+    throw imports.format.error(error)
+  }
+}
\ No newline at end of file
diff --git a/source/plugins/sponsorships/metadata.yml b/source/plugins/sponsorships/metadata.yml
new file mode 100644
index 00000000000..2ccd6d2ce00
--- /dev/null
+++ b/source/plugins/sponsorships/metadata.yml
@@ -0,0 +1,41 @@
+name: 💝 GitHub Sponsorships
+category: github
+description: |
+  This plugin displays sponsorships funded through [GitHub sponsors](https://github.com/sponsors/).
+examples:
+  default: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.sponsorships.svg
+supports:
+  - user
+  - organization
+scopes:
+  - read:user
+  - read:org
+inputs:
+
+  plugin_sponsorships:
+    description: |
+      Enable sponsorships plugin
+    type: boolean
+    default: no
+
+  plugin_sponsorships_sections:
+    description: |
+      Displayed sections
+
+      - `amount`: display total amount sponsored
+      - `sponsorships`: display GitHub sponsorships
+    type: array
+    format: comma-separated
+    default: amount, sponsorships
+    example: amount, sponsorships
+    values:
+      - amount
+      - sponsorships
+
+  plugin_sponsorships_size:
+    description: |
+      Profile picture display size
+    type: number
+    default: 24
+    min: 8
+    max: 64
\ No newline at end of file
diff --git a/source/plugins/sponsorships/queries/all.graphql b/source/plugins/sponsorships/queries/all.graphql
new file mode 100644
index 00000000000..5468b5167de
--- /dev/null
+++ b/source/plugins/sponsorships/queries/all.graphql
@@ -0,0 +1,29 @@
+query SponsorshipsAll {
+  $account(login: "$login") {
+    sponsorshipsAsSponsor($after first: 100, activeOnly: false, orderBy: {field: CREATED_AT, direction: DESC}) {
+      edges {
+        cursor
+      }
+      nodes {
+        createdAt
+        isActive
+        isOneTimePayment
+        tier {
+          name
+        }
+        privacyLevel
+        sponsorable {
+          ... on User {
+            avatarUrl(size: $size)
+            login
+          }
+          ... on Organization {
+            login
+            avatarUrl(size: $size)
+            url
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/source/plugins/sponsorships/queries/sponsorships.graphql b/source/plugins/sponsorships/queries/sponsorships.graphql
new file mode 100644
index 00000000000..d593bae1a3e
--- /dev/null
+++ b/source/plugins/sponsorships/queries/sponsorships.graphql
@@ -0,0 +1,10 @@
+query SponsorshipsDefault {
+  $account(login: "$login") {
+    totalSponsorshipAmountAsSponsorInCents
+    sponsorshipsAsSponsor(first: 1, activeOnly: false, orderBy: {field: CREATED_AT, direction: ASC}) {
+      nodes {
+        createdAt
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/source/templates/classic/partials/_.json b/source/templates/classic/partials/_.json
index 2a71867b01a..e8523ae520e 100644
--- a/source/templates/classic/partials/_.json
+++ b/source/templates/classic/partials/_.json
@@ -39,6 +39,7 @@
   "code",
   "chess",
   "sponsors",
+  "sponsorships",
   "poopmap",
   "fortune",
   "splatoon"
diff --git a/source/templates/classic/partials/sponsorships.ejs b/source/templates/classic/partials/sponsorships.ejs
new file mode 100644
index 00000000000..3ccca2642fa
--- /dev/null
+++ b/source/templates/classic/partials/sponsorships.ejs
@@ -0,0 +1,40 @@
+<% if (plugins.sponsorships) { %>
+  <section>
+    <h2 class="field">
+      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M10.586 1C12.268 1 13.5 2.37 13.5 4.25c0 1.745-.996 3.359-2.622 4.831-.166.15-.336.297-.509.438l1.116 5.584a.75.75 0 0 1-.991.852l-2.409-.876a.25.25 0 0 0-.17 0l-2.409.876a.75.75 0 0 1-.991-.852L5.63 9.519a13.78 13.78 0 0 1-.51-.438C3.497 7.609 2.5 5.995 2.5 4.25 2.5 2.37 3.732 1 5.414 1c.963 0 1.843.403 2.474 1.073L8 2.198l.112-.125a3.385 3.385 0 0 1 2.283-1.068L10.586 1Zm-3.621 9.495-.718 3.594 1.155-.42a1.75 1.75 0 0 1 1.028-.051l.168.051 1.154.42-.718-3.592c-.199.13-.37.235-.505.314l-.169.097a.75.75 0 0 1-.72 0 9.54 9.54 0 0 1-.515-.308l-.16-.105ZM10.586 2.5c-.863 0-1.611.58-1.866 1.459-.209.721-1.231.721-1.44 0C7.025 3.08 6.277 2.5 5.414 2.5 4.598 2.5 4 3.165 4 4.25c0 1.23.786 2.504 2.128 3.719.49.443 1.018.846 1.546 1.198l.325.21.076-.047.251-.163a13.341 13.341 0 0 0 1.546-1.198C11.214 6.754 12 5.479 12 4.25c0-1.085-.598-1.75-1.414-1.75Z"></path></svg>
+      Sponsorships
+    </h2>
+      <% if (plugins.sponsorships.error) { %>
+        <div class="row fill-width">
+          <section>
+            <div class="field error">
+              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M2.343 13.657A8 8 0 1113.657 2.343 8 8 0 012.343 13.657zM6.03 4.97a.75.75 0 00-1.06 1.06L6.94 8 4.97 9.97a.75.75 0 101.06 1.06L8 9.06l1.97 1.97a.75.75 0 101.06-1.06L9.06 8l1.97-1.97a.75.75 0 10-1.06-1.06L8 6.94 6.03 4.97z"></path></svg>
+              <%= plugins.sponsorships.error.message %>
+            </div>
+          </section>
+        </div>
+      <% } else { %>
+        <% for (const section of plugins.sponsorships.sections) { %>
+          <div class="row fill-width">
+            <% if (section === "amount") { %>
+              <section class="sponsorships sponsors goal">
+                <img src="<%= plugins.sponsorships.image %>" alt="" />
+                <div><span class="bold"><%= user.login %></span> has given a total of <span class="bold"><%= new Intl.NumberFormat("en", {style:"currency", currency:"USD"}).format(plugins.sponsorships.amount) %></span> to open source software<% if (plugins.sponsorships.started) { %> since <span class="bold"><%= f.date(plugins.sponsorships.started, { date:true, timeZone:config.timezone?.name}) %></span><% } %>.</div>
+              </section>
+            <% } else if (section === "sponsorships") { %>
+              <section class="sponsors goal">
+                <div class="goal-text">
+                  <span>
+                    <%= user.login %> helped funding the work of <%= plugins.sponsorships.list.length %> users and organizations.
+                  </span>
+                </div>
+                <div class="row">
+                  <% for (const user of plugins.sponsorships.list) { %><img class="avatar <%= user.past ? 'past' : '' %> <%= user.type === "organization" ? "organization" : "" %>" src="<%= user.avatar %>" width="<%= 0.8*plugins.sponsorships.size %>" height="<%= 0.8*plugins.sponsorships.size %>" alt="" /><% } %>
+                </div>
+              </section>
+            <% } %>
+          </div>
+        <% } %>
+      <% } %>
+  </section>
+<% } %>
diff --git a/source/templates/classic/style.css b/source/templates/classic/style.css
index f7788019532..a9abb963429 100644
--- a/source/templates/classic/style.css
+++ b/source/templates/classic/style.css
@@ -1161,6 +1161,17 @@
   .sponsors .avatar {
     margin: 2px;
   }
+  .sponsorships.goal {
+    display: flex;
+    align-items: center;
+  }
+  .sponsorships.goal .bold {
+    font-weight: bold;
+  }
+  .sponsorships.goal img {
+    width: 38px;
+    margin-right: 8px;
+  }
 
 /* Stackoverflow */
   .stackoverflow {
diff --git a/tests/mocks/api/github/graphql/sponsorships.all.mjs b/tests/mocks/api/github/graphql/sponsorships.all.mjs
new file mode 100644
index 00000000000..6823e5b2242
--- /dev/null
+++ b/tests/mocks/api/github/graphql/sponsorships.all.mjs
@@ -0,0 +1,33 @@
+/**Mocked data */
+export default function({faker, query, login = faker.internet.userName()}) {
+  console.debug("metrics/compute/mocks > mocking graphql api result > sponsorships/all")
+  return /after: "MOCKED_CURSOR"/m.test(query)
+    ? ({
+      user: {
+        sponsorshipsAsSponsor: {
+          edges: [],
+          nodes: [],
+        },
+      },
+    })
+    : ({
+      user: {
+        sponsorshipsAsSponsor: {
+          edges: new Array(10).fill("MOCKED_CURSOR"),
+          nodes: new Array(10).fill(null).map(_ => ({
+            createdAt: `${faker.date.recent()}`,
+            isActive: faker.datatype.boolean(),
+            isOneTimePayment: faker.datatype.boolean(),
+            tier: {
+              name: "$X a month"
+            },
+            privacyLevel: "PUBLIC",
+            sponsorable: {
+              login: faker.internet.userName(),
+              avatarUrl: null,
+            },
+          })),
+        },
+      },
+    })
+}
diff --git a/tests/mocks/api/github/graphql/sponsorships.default.mjs b/tests/mocks/api/github/graphql/sponsorships.default.mjs
new file mode 100644
index 00000000000..980405694ec
--- /dev/null
+++ b/tests/mocks/api/github/graphql/sponsorships.default.mjs
@@ -0,0 +1,12 @@
+/**Mocked data */
+export default function({faker, query, login = faker.internet.userName()}) {
+  console.debug("metrics/compute/mocks > mocking graphql api result > sponsorships/default")
+  return ({
+    user: {
+      totalSponsorshipAmountAsSponsorInCents:faker.datatype.number(100000),
+      sponsorshipsAsSponsor:{
+        nodes:[{createdAt: `${faker.date.recent()}`}]
+      }
+    },
+  })
+}

From 2c25d33882cf65b14a8e6e62f3a6d5fca182c2be Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 17 Jan 2023 04:07:02 +0000
Subject: [PATCH 062/196] chore: code formatting

---
 source/app/web/statics/embed/app.placeholder.js         | 6 +++---
 source/plugins/sponsorships/index.mjs                   | 6 +++---
 tests/mocks/api/github/graphql/sponsorships.all.mjs     | 2 +-
 tests/mocks/api/github/graphql/sponsorships.default.mjs | 8 ++++----
 4 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/source/app/web/statics/embed/app.placeholder.js b/source/app/web/statics/embed/app.placeholder.js
index 65aa3805439..f671abaaeeb 100644
--- a/source/app/web/statics/embed/app.placeholder.js
+++ b/source/app/web/statics/embed/app.placeholder.js
@@ -458,13 +458,13 @@
             },
           })
           : null),
-         //Sponsorships
-         ...(set.plugins.enabled.sponsorships
+        //Sponsorships
+        ...(set.plugins.enabled.sponsorships
           ? ({
             sponsorships: {
               sections: options["sponsorships.sections"].split(",").map(x => x.trim()),
               amount: faker.datatype.number(1000),
-              list: new Array(2+faker.datatype.number(8)).fill(null).map(_ => ({
+              list: new Array(2 + faker.datatype.number(8)).fill(null).map(_ => ({
                 login: faker.internet.userName(),
                 avatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
                 type: "user",
diff --git a/source/plugins/sponsorships/index.mjs b/source/plugins/sponsorships/index.mjs
index 946446da1cd..26651aba879 100644
--- a/source/plugins/sponsorships/index.mjs
+++ b/source/plugins/sponsorships/index.mjs
@@ -14,7 +14,7 @@ export default async function({login, q, imports, data, graphql, queries, accoun
     if (sections.includes("amount")) {
       console.debug(`metrics/compute/${login}/plugins > sponsorships > querying total amount spend`)
       const {totalSponsorshipAmountAsSponsorInCents, sponsorshipsAsSponsor} = (await graphql(queries.sponsorships({login, account})))[account]
-      amount = totalSponsorshipAmountAsSponsorInCents/100
+      amount = totalSponsorshipAmountAsSponsorInCents / 100
       image = "https://github.githubassets.com/images/icons/emoji/hearts_around.png"
       started = sponsorshipsAsSponsor.nodes[0]?.createdAt ? new Date(sponsorshipsAsSponsor.nodes[0]?.createdAt) : null
     }
@@ -36,7 +36,7 @@ export default async function({login, q, imports, data, graphql, queries, accoun
           pushed = nodes.length
           console.debug(`metrics/compute/${login}/sponsorships > retrieved ${pushed} sponsorships events after ${cursor}`)
         } while ((pushed) && (cursor))
-        list.push(...fetched.map(({sponsorable: {login, avatarUrl, url: organization = null}, tier:{name:tier}, privacyLevel:privacy, isActive:active}) => ({login, avatarUrl, type: organization ? "organization" : "user", tier, private: privacy !== "PUBLIC", past:!active})))
+        list.push(...fetched.map(({sponsorable: {login, avatarUrl, url: organization = null}, tier: {name: tier}, privacyLevel: privacy, isActive: active}) => ({login, avatarUrl, type: organization ? "organization" : "user", tier, private: privacy !== "PUBLIC", past: !active})))
       }
       await Promise.all(list.map(async user => user.avatar = await imports.imgb64(user.avatarUrl)))
     }
@@ -48,4 +48,4 @@ export default async function({login, q, imports, data, graphql, queries, accoun
   catch (error) {
     throw imports.format.error(error)
   }
-}
\ No newline at end of file
+}
diff --git a/tests/mocks/api/github/graphql/sponsorships.all.mjs b/tests/mocks/api/github/graphql/sponsorships.all.mjs
index 6823e5b2242..9983bad32a5 100644
--- a/tests/mocks/api/github/graphql/sponsorships.all.mjs
+++ b/tests/mocks/api/github/graphql/sponsorships.all.mjs
@@ -19,7 +19,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
             isActive: faker.datatype.boolean(),
             isOneTimePayment: faker.datatype.boolean(),
             tier: {
-              name: "$X a month"
+              name: "$X a month",
             },
             privacyLevel: "PUBLIC",
             sponsorable: {
diff --git a/tests/mocks/api/github/graphql/sponsorships.default.mjs b/tests/mocks/api/github/graphql/sponsorships.default.mjs
index 980405694ec..1187d6bf68d 100644
--- a/tests/mocks/api/github/graphql/sponsorships.default.mjs
+++ b/tests/mocks/api/github/graphql/sponsorships.default.mjs
@@ -3,10 +3,10 @@ export default function({faker, query, login = faker.internet.userName()}) {
   console.debug("metrics/compute/mocks > mocking graphql api result > sponsorships/default")
   return ({
     user: {
-      totalSponsorshipAmountAsSponsorInCents:faker.datatype.number(100000),
-      sponsorshipsAsSponsor:{
-        nodes:[{createdAt: `${faker.date.recent()}`}]
-      }
+      totalSponsorshipAmountAsSponsorInCents: faker.datatype.number(100000),
+      sponsorshipsAsSponsor: {
+        nodes: [{createdAt: `${faker.date.recent()}`}],
+      },
     },
   })
 }

From 8b66dee3fa5f8c3068b51f145c1c039bb9dbd870 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 16 Jan 2023 23:25:54 -0500
Subject: [PATCH 063/196] chore(deps): upgrade (#1361)

---
 package-lock.json     | 159 ++++++++++++++++++++++--------------------
 package.json          |  14 ++--
 tests/metrics.test.js |   4 +-
 3 files changed, 92 insertions(+), 85 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 8a2b38bb877..b23111f2c23 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,33 +13,39 @@
         "@actions/core": "^1.10.0",
         "@actions/github": "^5.1.1",
         "@faker-js/faker": "^7.6.0",
+        "@googlemaps/google-maps-services-js": "^3.3.26",
         "@octokit/graphql": "^5.0.4",
         "@octokit/rest": "^19.0.5",
         "@primer/css": "^20.8.0",
-        "@primer/octicons": "^17.10.1",
+        "@primer/octicons": "^17.10.2",
         "@twemoji/parser": "^14.1.0",
-        "axios": "^1.1.3",
+        "axios": "^1.2.2",
+        "chess.js": "^1.0.0-beta.1",
         "clipboard": "^2.0.11",
+        "color": "^4.2.3",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
-        "d3": "^7.8.0",
+        "d3": "^7.8.1",
         "ejs": "^3.1.8",
         "emoji-name-map": "^1.2.9",
         "express": "^4.18.2",
         "express-rate-limit": "^6.7.0",
         "file-type": "^18.2.0",
+        "gifencoder": "^2.0.1",
         "js-yaml": "^4.1.0",
         "jsdom": "^21.0.0",
-        "linguist-js": "^2.5.3",
-        "marked": "^4.2.5",
+        "linguist-js": "^2.5.4",
+        "marked": "^4.2.12",
         "memory-cache": "^0.2.0",
         "minimatch": "^6.0.4",
+        "node-chartist": "^1.0.5",
         "node-fetch": "^3.3.0",
         "open-graph-scraper": "^5.0.3",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^19.5.0",
+        "puppeteer": "^19.5.2",
         "purgecss": "^5.0.0",
+        "rss": "^1.2.2",
         "rss-parser": "^3.12.0",
         "sanitize-html": "^2.8.1",
         "sharp": "^0.31.3",
@@ -47,7 +53,8 @@
         "svgo": "^3.0.2",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
-        "xml-formatter": "^3.2.0"
+        "xml-formatter": "^3.2.0",
+        "yargs-parser": "^21.1.1"
       },
       "devDependencies": {
         "eslint": "^8.32.0",
@@ -56,7 +63,7 @@
       },
       "optionalDependencies": {
         "@googlemaps/google-maps-services-js": "^3.3.26",
-        "chess.js": "^1.0.0-alpha.0",
+        "chess.js": "^1.0.0-beta.1",
         "color": "^4.2.3",
         "gifencoder": "^2.0.1",
         "libxmljs2": "^0.31.0",
@@ -1982,9 +1989,9 @@
       }
     },
     "node_modules/@primer/octicons": {
-      "version": "17.10.1",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.1.tgz",
-      "integrity": "sha512-fyq/lItQp18Ibi7c2oXVVw7H5K2a8qb8D2dnkTLf2+yUPjc3Fc+SEGS9x6iU6sQAEpr4LctcFl9ZSZ732EM63A==",
+      "version": "17.10.2",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.2.tgz",
+      "integrity": "sha512-J/p2PcgT39Za4wpukbN6iUkEUvL5aE7Bs9kXBeEkrjEgc0Uu7J7B2ypwx9J0qM3m3lk2273RT5/4oGv8pfFLcg==",
       "dependencies": {
         "object-assign": "^4.1.1"
       }
@@ -2522,9 +2529,9 @@
       "optional": true
     },
     "node_modules/axios": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz",
-      "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz",
+      "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==",
       "dependencies": {
         "follow-redirects": "^1.15.0",
         "form-data": "^4.0.0",
@@ -3048,9 +3055,9 @@
       }
     },
     "node_modules/chess.js": {
-      "version": "1.0.0-alpha.0",
-      "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.0.0-alpha.0.tgz",
-      "integrity": "sha512-nwEDlNEOZR/FaKW1DZLYtjgJrtAlxBW/6Fp4Hk8QXqpCCLrXweOU6/vKfJ/jNHT2gPqasxi0/ZPslcWAAdzozg==",
+      "version": "1.0.0-beta.1",
+      "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.0.0-beta.1.tgz",
+      "integrity": "sha512-yXGLpKcorxm8TYzDf7Yu7sxkjuWDeFCFmR4/8GG4+5ksdFbYOyfp+MUtN3Z/EuZr5dOxFgjNyBoqbzQpIN5Z8w==",
       "optional": true
     },
     "node_modules/chownr": {
@@ -3491,9 +3498,9 @@
       "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
     },
     "node_modules/d3": {
-      "version": "7.8.0",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.0.tgz",
-      "integrity": "sha512-a5rNemRadWkEfqnY5NsD4RdCP9vn8EIJ4I5Rl14U0uKH1SXqcNmk/h9aGaAF1O98lz6L9M0IeUcuPa9GUYbI5A==",
+      "version": "7.8.1",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.1.tgz",
+      "integrity": "sha512-fdipulGWUYTZTxxU9gDJ2P4mpZL2u7Oqe6n2FI95Q8UY0AjbKNYjPHvhLOsvR+HcSao4vo3YYy4Bk9CWOrt1Vw==",
       "dependencies": {
         "d3-array": "3",
         "d3-axis": "3",
@@ -5614,9 +5621,9 @@
       ]
     },
     "node_modules/ignore": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+      "version": "5.2.4",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+      "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
       "engines": {
         "node": ">= 4"
       }
@@ -6928,16 +6935,16 @@
       "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
     },
     "node_modules/linguist-js": {
-      "version": "2.5.3",
-      "resolved": "https://registry.npmjs.org/linguist-js/-/linguist-js-2.5.3.tgz",
-      "integrity": "sha512-VYIei0yTRIqQ5JMClQr3txNpJgEh3tb/8EWqaPNJsMZIprx+fazeS6JmaVzoKkAPGXGIXxVSEF/glgn7ecC0Ug==",
+      "version": "2.5.4",
+      "resolved": "https://registry.npmjs.org/linguist-js/-/linguist-js-2.5.4.tgz",
+      "integrity": "sha512-sn0TNXtwizY8RElyN//O11b2Z7H0e/sYwIJzC39sxC+Keb4oD3QlFfBEL0iVNh7CLnZeONzIEWYxCe3x5wn+2g==",
       "dependencies": {
         "binary-extensions": "^2.2.0",
-        "commander": "^9.4.0",
+        "commander": "^9.5.0",
         "common-path-prefix": "^3.0.0",
         "cross-fetch": "^3.1.5",
-        "ignore": "^5.2.0",
-        "isbinaryfile": "^4.0.8",
+        "ignore": "^5.2.4",
+        "isbinaryfile": "^4.0.8 <5",
         "js-yaml": "^4.1.0",
         "node-cache": "^5.1.2"
       },
@@ -6950,9 +6957,9 @@
       }
     },
     "node_modules/linguist-js/node_modules/commander": {
-      "version": "9.4.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
-      "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==",
+      "version": "9.5.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+      "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
       "engines": {
         "node": "^12.20.0 || >=14"
       }
@@ -7048,9 +7055,9 @@
       }
     },
     "node_modules/marked": {
-      "version": "4.2.5",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.5.tgz",
-      "integrity": "sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ==",
+      "version": "4.2.12",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
+      "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
       "bin": {
         "marked": "bin/marked.js"
       },
@@ -8139,25 +8146,25 @@
       }
     },
     "node_modules/puppeteer": {
-      "version": "19.5.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.5.0.tgz",
-      "integrity": "sha512-601tKJdKu/mlL6l5wklNJiQbIxyEU2N4pwZzFkwhr1VizNYV0Fly1aFMT7qAp7CvzklYLypQGKn7/Zgpy+HheA==",
+      "version": "19.5.2",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.5.2.tgz",
+      "integrity": "sha512-xlqRyrhXhVH114l79Y0XqYXUVG+Yfw4sKlvN55t8Y9DxtA5fzI1uqF8SVXbWK5DUMbD6Jo4lpixTZCTTZGD05g==",
       "hasInstallScript": true,
       "dependencies": {
         "cosmiconfig": "8.0.0",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.5.0"
+        "puppeteer-core": "19.5.2"
       },
       "engines": {
         "node": ">=14.1.0"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "19.5.0",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.5.0.tgz",
-      "integrity": "sha512-s2EE2x/7UfvR4AP+6OokY7yEmIboZoQFc2InuWUu5grWG7uka3W2Nch6+R4ERQepH4NO8kkkEBzNO4PqtwU4lQ==",
+      "version": "19.5.2",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.5.2.tgz",
+      "integrity": "sha512-Rqk+3kqM+Z2deooTYqcYt8lRtGffJdifWa9td9nbJSjhANWsFouk8kLBNUKycewCCFHM8TZUKS0x28OllavW2A==",
       "dependencies": {
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
@@ -11676,9 +11683,9 @@
       }
     },
     "@primer/octicons": {
-      "version": "17.10.1",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.1.tgz",
-      "integrity": "sha512-fyq/lItQp18Ibi7c2oXVVw7H5K2a8qb8D2dnkTLf2+yUPjc3Fc+SEGS9x6iU6sQAEpr4LctcFl9ZSZ732EM63A==",
+      "version": "17.10.2",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.2.tgz",
+      "integrity": "sha512-J/p2PcgT39Za4wpukbN6iUkEUvL5aE7Bs9kXBeEkrjEgc0Uu7J7B2ypwx9J0qM3m3lk2273RT5/4oGv8pfFLcg==",
       "requires": {
         "object-assign": "^4.1.1"
       }
@@ -12135,9 +12142,9 @@
       "optional": true
     },
     "axios": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.1.3.tgz",
-      "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==",
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz",
+      "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==",
       "requires": {
         "follow-redirects": "^1.15.0",
         "form-data": "^4.0.0",
@@ -12515,9 +12522,9 @@
       }
     },
     "chess.js": {
-      "version": "1.0.0-alpha.0",
-      "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.0.0-alpha.0.tgz",
-      "integrity": "sha512-nwEDlNEOZR/FaKW1DZLYtjgJrtAlxBW/6Fp4Hk8QXqpCCLrXweOU6/vKfJ/jNHT2gPqasxi0/ZPslcWAAdzozg==",
+      "version": "1.0.0-beta.1",
+      "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.0.0-beta.1.tgz",
+      "integrity": "sha512-yXGLpKcorxm8TYzDf7Yu7sxkjuWDeFCFmR4/8GG4+5ksdFbYOyfp+MUtN3Z/EuZr5dOxFgjNyBoqbzQpIN5Z8w==",
       "optional": true
     },
     "chownr": {
@@ -12858,9 +12865,9 @@
       "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
     },
     "d3": {
-      "version": "7.8.0",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.0.tgz",
-      "integrity": "sha512-a5rNemRadWkEfqnY5NsD4RdCP9vn8EIJ4I5Rl14U0uKH1SXqcNmk/h9aGaAF1O98lz6L9M0IeUcuPa9GUYbI5A==",
+      "version": "7.8.1",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.1.tgz",
+      "integrity": "sha512-fdipulGWUYTZTxxU9gDJ2P4mpZL2u7Oqe6n2FI95Q8UY0AjbKNYjPHvhLOsvR+HcSao4vo3YYy4Bk9CWOrt1Vw==",
       "requires": {
         "d3-array": "3",
         "d3-axis": "3",
@@ -14406,9 +14413,9 @@
       "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
     },
     "ignore": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
-      "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ=="
+      "version": "5.2.4",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+      "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ=="
     },
     "import-fresh": {
       "version": "3.3.0",
@@ -15403,24 +15410,24 @@
       "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
     },
     "linguist-js": {
-      "version": "2.5.3",
-      "resolved": "https://registry.npmjs.org/linguist-js/-/linguist-js-2.5.3.tgz",
-      "integrity": "sha512-VYIei0yTRIqQ5JMClQr3txNpJgEh3tb/8EWqaPNJsMZIprx+fazeS6JmaVzoKkAPGXGIXxVSEF/glgn7ecC0Ug==",
+      "version": "2.5.4",
+      "resolved": "https://registry.npmjs.org/linguist-js/-/linguist-js-2.5.4.tgz",
+      "integrity": "sha512-sn0TNXtwizY8RElyN//O11b2Z7H0e/sYwIJzC39sxC+Keb4oD3QlFfBEL0iVNh7CLnZeONzIEWYxCe3x5wn+2g==",
       "requires": {
         "binary-extensions": "^2.2.0",
-        "commander": "^9.4.0",
+        "commander": "^9.5.0",
         "common-path-prefix": "^3.0.0",
         "cross-fetch": "^3.1.5",
-        "ignore": "^5.2.0",
-        "isbinaryfile": "^4.0.8",
+        "ignore": "^5.2.4",
+        "isbinaryfile": "^4.0.8 <5",
         "js-yaml": "^4.1.0",
         "node-cache": "^5.1.2"
       },
       "dependencies": {
         "commander": {
-          "version": "9.4.1",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
-          "integrity": "sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw=="
+          "version": "9.5.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+          "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="
         }
       }
     },
@@ -15496,9 +15503,9 @@
       }
     },
     "marked": {
-      "version": "4.2.5",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.5.tgz",
-      "integrity": "sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ=="
+      "version": "4.2.12",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
+      "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw=="
     },
     "matchmedia": {
       "version": "0.1.2",
@@ -16321,21 +16328,21 @@
       "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
     },
     "puppeteer": {
-      "version": "19.5.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.5.0.tgz",
-      "integrity": "sha512-601tKJdKu/mlL6l5wklNJiQbIxyEU2N4pwZzFkwhr1VizNYV0Fly1aFMT7qAp7CvzklYLypQGKn7/Zgpy+HheA==",
+      "version": "19.5.2",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.5.2.tgz",
+      "integrity": "sha512-xlqRyrhXhVH114l79Y0XqYXUVG+Yfw4sKlvN55t8Y9DxtA5fzI1uqF8SVXbWK5DUMbD6Jo4lpixTZCTTZGD05g==",
       "requires": {
         "cosmiconfig": "8.0.0",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.5.0"
+        "puppeteer-core": "19.5.2"
       }
     },
     "puppeteer-core": {
-      "version": "19.5.0",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.5.0.tgz",
-      "integrity": "sha512-s2EE2x/7UfvR4AP+6OokY7yEmIboZoQFc2InuWUu5grWG7uka3W2Nch6+R4ERQepH4NO8kkkEBzNO4PqtwU4lQ==",
+      "version": "19.5.2",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.5.2.tgz",
+      "integrity": "sha512-Rqk+3kqM+Z2deooTYqcYt8lRtGffJdifWa9td9nbJSjhANWsFouk8kLBNUKycewCCFHM8TZUKS0x28OllavW2A==",
       "requires": {
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
diff --git a/package.json b/package.json
index 8b00294f741..ab4462a0aac 100644
--- a/package.json
+++ b/package.json
@@ -35,13 +35,13 @@
     "@octokit/graphql": "^5.0.4",
     "@octokit/rest": "^19.0.5",
     "@primer/css": "^20.8.0",
-    "@primer/octicons": "^17.10.1",
+    "@primer/octicons": "^17.10.2",
     "@twemoji/parser": "^14.1.0",
-    "axios": "^1.1.3",
+    "axios": "^1.2.2",
     "clipboard": "^2.0.11",
     "compression": "^1.7.4",
     "csso": "^5.0.5",
-    "d3": "^7.8.0",
+    "d3": "^7.8.1",
     "ejs": "^3.1.8",
     "emoji-name-map": "^1.2.9",
     "express": "^4.18.2",
@@ -49,15 +49,15 @@
     "file-type": "^18.2.0",
     "js-yaml": "^4.1.0",
     "jsdom": "^21.0.0",
-    "linguist-js": "^2.5.3",
-    "marked": "^4.2.5",
+    "linguist-js": "^2.5.4",
+    "marked": "^4.2.12",
     "memory-cache": "^0.2.0",
     "minimatch": "^6.0.4",
     "node-fetch": "^3.3.0",
     "open-graph-scraper": "^5.0.3",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^19.5.0",
+    "puppeteer": "^19.5.2",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.12.0",
     "sanitize-html": "^2.8.1",
@@ -80,7 +80,7 @@
   },
   "optionalDependencies": {
     "@googlemaps/google-maps-services-js": "^3.3.26",
-    "chess.js": "^1.0.0-alpha.0",
+    "chess.js": "^1.0.0-beta.1",
     "color": "^4.2.3",
     "gifencoder": "^2.0.1",
     "libxmljs2": "^0.31.0",
diff --git a/tests/metrics.test.js b/tests/metrics.test.js
index fa1491181ec..ab40b51c532 100644
--- a/tests/metrics.test.js
+++ b/tests/metrics.test.js
@@ -29,7 +29,7 @@ action.run = async vars =>
 
 //Web instance
 const web = {}
-web.run = async vars => (await axios(`http://localhost:3000/lowlighter?${new url.URLSearchParams(Object.fromEntries(Object.entries(vars).map(([key, value]) => [key.replace(/^plugin_/, "").replace(/_/g, "."), value])))}`)).status === 200
+web.run = async vars => (await axios.get(`http://localhost:3000/lowlighter?${new url.URLSearchParams(Object.fromEntries(Object.entries(vars).map(([key, value]) => [key.replace(/^plugin_/, "").replace(/_/g, "."), value])))}`)).status === 200
 web.start = async () =>
   new Promise(solve => {
     let stdout = ""
@@ -48,7 +48,7 @@ placeholder.init({
   ejs,
   axios: {
     async get(url) {
-      return axios(`http://localhost:3000${url}`)
+      return axios.get(`http://localhost:3000${url}`)
     },
   },
 })

From 05e185a15dd9dc6ef2501d9e9f30bb9ba28bfb3a Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 17 Jan 2023 00:51:08 -0500
Subject: [PATCH 064/196] ci: auto-regenerate files

---
 .github/workflows/examples.yml | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index e393458b617..1321dc359f9 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -812,6 +812,18 @@ jobs:
           user: lowlighter
           plugins_errors_fatal: yes
         if: ${{ success() || failure() }}
+      - name: 💝 GitHub Sponsorships - 💝 GitHub sponsorships
+        uses: lowlighter/metrics@master
+        with:
+          filename: metrics.plugin.sponsorships.svg
+          token: ${{ secrets.METRICS_TOKEN }}
+          base: ""
+          plugin_sponsorships: yes
+          output_action: none
+          delay: 120
+          user: lowlighter
+          plugins_errors_fatal: yes
+        if: ${{ success() || failure() }}
       - name: ⏱️ Google PageSpeed - Succinct report
         uses: lowlighter/metrics@master
         with:

From 8b34b0ab935ff61080ae3196a871bf32dc3a0ae6 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 17 Jan 2023 06:30:11 +0000
Subject: [PATCH 065/196] ci: auto-regenerate files

---
 .../partials/documentation/compatibility.md   | 11 ++-
 README.md                                     | 48 ++++++-----
 action.yml                                    | 15 ++++
 settings.example.json                         |  3 +
 source/plugins/README.md                      |  1 +
 source/plugins/sponsorships/README.md         | 82 +++++++++++++++++++
 source/templates/classic/README.md            |  2 +-
 tests/cases/sponsorships.plugin.yml           |  7 ++
 8 files changed, 145 insertions(+), 24 deletions(-)
 create mode 100644 tests/cases/sponsorships.plugin.yml

diff --git a/.github/readme/partials/documentation/compatibility.md b/.github/readme/partials/documentation/compatibility.md
index 006779b7233..400b3483127 100644
--- a/.github/readme/partials/documentation/compatibility.md
+++ b/.github/readme/partials/documentation/compatibility.md
@@ -30,6 +30,7 @@
     <th nowrap="nowrap" align="center" title="🎫 Gists">🎫</th>
     <th nowrap="nowrap" align="center" title="🗂️ GitHub projects">🗂️</th>
     <th nowrap="nowrap" align="center" title="🌇 GitHub Skyline">🌇</th>
+    <th nowrap="nowrap" align="center" title="💝 GitHub Sponsorships">💝</th>
     <th nowrap="nowrap" align="center" title="💭 GitHub Community Support">💭</th>
     <th nowrap="nowrap" align="center" title="⏱️ Google PageSpeed">⏱️</th>
     <th nowrap="nowrap" align="center" title="🐤 Latest tweets">🐤</th>
@@ -70,6 +71,7 @@
     <td nowrap="nowrap" align="center" data-plugin="gists">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="support">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">✔️</td>
@@ -110,6 +112,7 @@
     <td nowrap="nowrap" align="center" data-plugin="gists">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">❌</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="support">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">❌</td>
@@ -150,6 +153,7 @@
     <td nowrap="nowrap" align="center" data-plugin="gists">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">❌</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="support">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">❌</td>
@@ -190,6 +194,7 @@
     <td nowrap="nowrap" align="center" data-plugin="gists">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">✓</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="support">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">✔️</td>
@@ -202,7 +207,7 @@
     <td nowrap="nowrap" align="center" data-plugin="leetcode">✓</td>
   </tr>
   <tr>
-    <td colspan="37"></td>
+    <td colspan="38"></td>
   </tr>
   <tr>
     <th nowrap="nowrap">Mode/Plugin</th>    
@@ -233,6 +238,7 @@
     <th nowrap="nowrap" align="center" title="🎫 Gists">🎫</th>
     <th nowrap="nowrap" align="center" title="🗂️ GitHub projects">🗂️</th>
     <th nowrap="nowrap" align="center" title="🌇 GitHub Skyline">🌇</th>
+    <th nowrap="nowrap" align="center" title="💝 GitHub Sponsorships">💝</th>
     <th nowrap="nowrap" align="center" title="💭 GitHub Community Support">💭</th>
     <th nowrap="nowrap" align="center" title="⏱️ Google PageSpeed">⏱️</th>
     <th nowrap="nowrap" align="center" title="🐤 Latest tweets">🐤</th>
@@ -273,6 +279,7 @@
     <td nowrap="nowrap" align="center" data-plugin="gists">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="support">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">✔️</td>
@@ -313,6 +320,7 @@
     <td nowrap="nowrap" align="center" data-plugin="gists">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">❌</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="support">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">✔️</td>
@@ -353,6 +361,7 @@
     <td nowrap="nowrap" align="center" data-plugin="gists">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">❌</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="support">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">❌</td>
diff --git a/README.md b/README.md
index fd5066098d3..4ddae2988f1 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
   </tr>
   <tr>
     <th colspan="2" align="center">
-      <h3><a href="/README.md#-plugins">🧩 Customizable with 43 plugins and 311 options!</a></h3>
+      <h3><a href="/README.md#-plugins">🧩 Customizable with 44 plugins and 314 options!</a></h3>
     </th>
   </tr>
   <tr>
@@ -227,78 +227,81 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
       </td>
   </tr>
   <tr>
+    <th><a href="source/plugins/sponsorships/README.md">💝 GitHub Sponsorships</a></th>
     <th><a href="source/plugins/pagespeed/README.md">⏱️ Google PageSpeed</a></th>
-    <th><a href="source/plugins/tweets/README.md">🐤 Latest tweets</a></th>
   </tr>
   <tr>
         <td  align="center">
-        <details open><summary>PageSpeed scores</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.pagespeed.svg" alt=""></img></details>
-        <details><summary>PageSpeed scores with detailed report</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.pagespeed.detailed.svg" alt=""></img></details>
-        <details><summary>PageSpeed scores with a website screenshot</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.pagespeed.screenshot.svg" alt=""></img></details>
+        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.sponsorships.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </td>
         <td  align="center">
-        <details open><summary>Latest tweets with attachments</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.tweets.attachments.svg" alt=""></img></details>
-        <details><summary>Latest tweets</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.tweets.svg" alt=""></img></details>
+        <details open><summary>PageSpeed scores</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.pagespeed.svg" alt=""></img></details>
+        <details><summary>PageSpeed scores with detailed report</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.pagespeed.detailed.svg" alt=""></img></details>
+        <details><summary>PageSpeed scores with a website screenshot</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.pagespeed.screenshot.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
   </tr>
   <tr>
+    <th><a href="source/plugins/tweets/README.md">🐤 Latest tweets</a></th>
     <th><a href="source/plugins/stackoverflow/README.md">🗨️ Stack Overflow</a></th>
-    <th><a href="source/plugins/anilist/README.md">🌸 Anilist watch list and reading list</a></th>
   </tr>
   <tr>
         <td  align="center">
-        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stackoverflow.svg" alt=""></img>
+        <details open><summary>Latest tweets with attachments</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.tweets.attachments.svg" alt=""></img></details>
+        <details><summary>Latest tweets</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.tweets.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
         <td  align="center">
-        <details open><summary>For anime watchers</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.anilist.svg" alt=""></img></details>
-        <details><summary>For manga readers</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.anilist.manga.svg" alt=""></img></details>
-        <details open><summary>For waifus simp</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.anilist.characters.svg" alt=""></img></details>
+        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stackoverflow.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </td>
   </tr>
   <tr>
+    <th><a href="source/plugins/anilist/README.md">🌸 Anilist watch list and reading list</a></th>
     <th><a href="source/plugins/music/README.md">🎼 Music activity and suggestions</a></th>
-    <th><a href="source/plugins/posts/README.md">✒️ Recent posts</a></th>
   </tr>
   <tr>
         <td  align="center">
-        <details open><summary>Random tracks from a playlist</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.music.playlist.svg" alt=""></img></details>
-        <details open><summary>Recently listened</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.music.recent.svg" alt=""></img></details>
+        <details open><summary>For anime watchers</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.anilist.svg" alt=""></img></details>
+        <details><summary>For manga readers</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.anilist.manga.svg" alt=""></img></details>
+        <details open><summary>For waifus simp</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.anilist.characters.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
         <td  align="center">
-        <details open><summary>Latest posts width description and cover image</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.posts.full.svg" alt=""></img></details>
-        <details><summary>Latest posts</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.posts.svg" alt=""></img></details>
+        <details open><summary>Random tracks from a playlist</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.music.playlist.svg" alt=""></img></details>
+        <details open><summary>Recently listened</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.music.recent.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
   </tr>
   <tr>
+    <th><a href="source/plugins/posts/README.md">✒️ Recent posts</a></th>
     <th><a href="source/plugins/rss/README.md">🗼 Rss feed</a></th>
-    <th><a href="source/plugins/wakatime/README.md">⏰ WakaTime</a></th>
   </tr>
   <tr>
         <td  align="center">
-        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.rss.svg" alt=""></img>
+        <details open><summary>Latest posts width description and cover image</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.posts.full.svg" alt=""></img></details>
+        <details><summary>Latest posts</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.posts.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
         <td  align="center">
-        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.wakatime.svg" alt=""></img>
+        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.rss.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </td>
   </tr>
   <tr>
+    <th><a href="source/plugins/wakatime/README.md">⏰ WakaTime</a></th>
     <th><a href="source/plugins/leetcode/README.md">🗳️ Leetcode</a></th>
-    <th></th>
   </tr>
   <tr>
+        <td  align="center">
+        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.wakatime.svg" alt=""></img>
+        <img width="900" height="1" alt="">
+      </td>
         <td  align="center">
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.leetcode.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </td>
-    <td align="center"><img width="900" height="1" alt=""></td>
   </tr>
   <tr>
     <th colspan="2" align="center">
@@ -497,6 +500,7 @@ Plugins provide additional content and lets you customize rendered metrics.
   * [📓 Featured repositories <sub>`repositories`</sub>](/source/plugins/repositories/README.md)
   * [🌇 GitHub Skyline <sub>`skyline`</sub>](/source/plugins/skyline/README.md)
   * [💕 GitHub Sponsors <sub>`sponsors`</sub>](/source/plugins/sponsors/README.md)
+  * [💝 GitHub Sponsorships <sub>`sponsorships`</sub>](/source/plugins/sponsorships/README.md)
   * [✨ Stargazers <sub>`stargazers`</sub>](/source/plugins/stargazers/README.md)
   * [💫 Star lists <sub>`starlists`</sub>](/source/plugins/starlists/README.md)
   * [🌟 Recently starred repositories <sub>`stars`</sub>](/source/plugins/stars/README.md)
diff --git a/action.yml b/action.yml
index a1dd590bc0e..52229a1764e 100644
--- a/action.yml
+++ b/action.yml
@@ -949,6 +949,21 @@ inputs:
     description: Advanced settings
     default: <default-value>
 
+  # ====================================================================================
+  # 💝 GitHub Sponsorships
+
+  plugin_sponsorships:
+    description: Enable sponsorships plugin
+    default: <default-value>
+
+  plugin_sponsorships_sections:
+    description: Displayed sections
+    default: <default-value>
+
+  plugin_sponsorships_size:
+    description: Profile picture display size
+    default: <default-value>
+
   # ====================================================================================
   # 💭 GitHub Community Support
 
diff --git a/settings.example.json b/settings.example.json
index c76ec09f3c2..ec11abd158c 100644
--- a/settings.example.json
+++ b/settings.example.json
@@ -143,6 +143,9 @@
     "skyline":{
       "enabled": false,                 "//": "Enable skyline plugin"
     },
+    "sponsorships":{
+      "enabled": false,                 "//": "Enable sponsorships plugin"
+    },
     "support":{
       "enabled": false,                 "//": "Enable support plugin"
     },
diff --git a/source/plugins/README.md b/source/plugins/README.md
index b28547e2ac1..e34fa9b4c10 100644
--- a/source/plugins/README.md
+++ b/source/plugins/README.md
@@ -29,6 +29,7 @@ Plugins provide additional content and lets you customize rendered metrics.
   * [📓 Featured repositories <sub>`repositories`</sub>](/source/plugins/repositories/README.md)
   * [🌇 GitHub Skyline <sub>`skyline`</sub>](/source/plugins/skyline/README.md)
   * [💕 GitHub Sponsors <sub>`sponsors`</sub>](/source/plugins/sponsors/README.md)
+  * [💝 GitHub Sponsorships <sub>`sponsorships`</sub>](/source/plugins/sponsorships/README.md)
   * [✨ Stargazers <sub>`stargazers`</sub>](/source/plugins/stargazers/README.md)
   * [💫 Star lists <sub>`starlists`</sub>](/source/plugins/starlists/README.md)
   * [🌟 Recently starred repositories <sub>`stars`</sub>](/source/plugins/stars/README.md)
diff --git a/source/plugins/sponsorships/README.md b/source/plugins/sponsorships/README.md
index 3eff2a87b38..5194d117597 100644
--- a/source/plugins/sponsorships/README.md
+++ b/source/plugins/sponsorships/README.md
@@ -1,12 +1,94 @@
 <!--header-->
+<table>
+  <tr><td colspan="2"><a href="/README.md#-plugins">← Back to plugins index</a></td></tr>
+  <tr><th colspan="2"><h3>💝 GitHub Sponsorships</h3></th></tr>
+  <tr><td colspan="2" align="center"><p>This plugin displays sponsorships funded through <a href="https://github.com/sponsors/">GitHub sponsors</a>.</p>
+</td></tr>
+  <tr><th>⚠️ Disclaimer</th><td><p>This plugin is not affiliated, associated, authorized, endorsed by, or in any way officially connected with <a href="https://github.com">GitHub</a>.
+All product and company names are trademarks™ or registered® trademarks of their respective holders.</p>
+</td></tr>
+  <tr>
+    <th rowspan="3">Supported features<br><sub><a href="metadata.yml">→ Full specification</a></sub></th>
+    <td><a href="/source/templates/classic/README.md"><code>📗 Classic template</code></a></td>
+  </tr>
+  <tr>
+    <td><code>👤 Users</code> <code>👥 Organizations</code></td>
+  </tr>
+  <tr>
+    <td><code>🔑 read:user</code> <code>🔑 read:org</code> <code>read:packages (optional)</code> <code>repo (optional)</code></td>
+  </tr>
+  <tr>
+    <td colspan="2" align="center">
+      <img src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.sponsorships.svg" alt=""></img>
+      <img width="900" height="1" alt="">
+    </td>
+  </tr>
+</table>
 <!--/header-->
 
 ## ➡️ Available options
 
 <!--options-->
+<table>
+  <tr>
+    <td align="center" nowrap="nowrap">Option</i></td><td align="center" nowrap="nowrap">Description</td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_sponsorships</code></h4></td>
+    <td rowspan="2"><p>Enable sponsorships plugin</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
+<br>
+<b>default:</b> no<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_sponsorships_sections</code></h4></td>
+    <td rowspan="2"><p>Displayed sections</p>
+<ul>
+<li><code>amount</code>: display total amount sponsored</li>
+<li><code>sponsorships</code>: display GitHub sponsorships</li>
+</ul>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
+<i>(comma-separated)</i>
+<br>
+<b>default:</b> amount, sponsorships<br>
+<b>allowed values:</b><ul><li>amount</li><li>sponsorships</li></ul></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_sponsorships_size</code></h4></td>
+    <td rowspan="2"><p>Profile picture display size</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
+<i>(8 ≤
+𝑥
+≤ 64)</i>
+<br>
+<b>default:</b> 24<br></td>
+  </tr>
+</table>
 <!--/options-->
 
 ## ℹ️ Examples workflows
 
 <!--examples-->
+```yaml
+name: 💝 GitHub sponsorships
+uses: lowlighter/metrics@latest
+with:
+  filename: metrics.plugin.sponsorships.svg
+  token: ${{ secrets.METRICS_TOKEN }}
+  base: ""
+  plugin_sponsorships: yes
+
+```
 <!--/examples-->
diff --git a/source/templates/classic/README.md b/source/templates/classic/README.md
index 1b07964c2b1..23509ab111f 100644
--- a/source/templates/classic/README.md
+++ b/source/templates/classic/README.md
@@ -7,7 +7,7 @@ This is also the default template.</p>
 </td></tr>
   <tr>
     <th rowspan="3">Supported features<br><sub><a href="metadata.yml">→ Full specification</a></sub></th>
-    <td><a href="/source/plugins/achievements/README.md" title="🏆 Achievements">🏆</a> <a href="/source/plugins/activity/README.md" title="📰 Recent activity">📰</a> <a href="/source/plugins/anilist/README.md" title="🌸 Anilist watch list and reading list">🌸</a> <a href="/source/plugins/calendar/README.md" title="📆 Commit calendar">📆</a> <a href="/source/plugins/code/README.md" title="♐ Random code snippet">♐</a> <a href="/source/plugins/chess/README.md" title="♟️ Chess">♟️</a> <a href="/source/plugins/fortune/README.md" title="🥠 Fortune">🥠</a> <a href="/source/plugins/nightscout/README.md" title="💉 Nightscout">💉</a> <a href="/source/plugins/poopmap/README.md" title="💩 PoopMap plugin">💩</a> <a href="/source/plugins/screenshot/README.md" title="📸 Website screenshot">📸</a> <a href="/source/plugins/splatoon/README.md" title="🦑 Splatoon">🦑</a> <a href="/source/plugins/stock/README.md" title="💹 Stock prices">💹</a> <a href="/source/plugins/discussions/README.md" title="💬 Discussions">💬</a> <a href="/source/plugins/followup/README.md" title="🎟️ Follow-up of issues and pull requests">🎟️</a> <a href="/source/plugins/gists/README.md" title="🎫 Gists">🎫</a> <a href="/source/plugins/habits/README.md" title="💡 Coding habits and activity">💡</a> <a href="/source/plugins/introduction/README.md" title="🙋 Introduction">🙋</a> <a href="/source/plugins/isocalendar/README.md" title="📅 Isometric commit calendar">📅</a> <a href="/source/plugins/languages/README.md" title="🈷️ Languages activity">🈷️</a> <a href="/source/plugins/leetcode/README.md" title="🗳️ Leetcode">🗳️</a> <a href="/source/plugins/lines/README.md" title="👨‍💻 Lines of code changed">👨‍💻</a> <a href="/source/plugins/music/README.md" title="🎼 Music activity and suggestions">🎼</a> <a href="/source/plugins/notable/README.md" title="🎩 Notable contributions">🎩</a> <a href="/source/plugins/pagespeed/README.md" title="⏱️ Google PageSpeed">⏱️</a> <a href="/source/plugins/people/README.md" title="🧑‍🤝‍🧑 People">🧑‍🤝‍🧑</a> <a href="/source/plugins/posts/README.md" title="✒️ Recent posts">✒️</a> <a href="/source/plugins/projects/README.md" title="🗂️ GitHub projects">🗂️</a> <a href="/source/plugins/reactions/README.md" title="🎭 Comment reactions">🎭</a> <a href="/source/plugins/repositories/README.md" title="📓 Featured repositories">📓</a> <a href="/source/plugins/rss/README.md" title="🗼 Rss feed">🗼</a> <a href="/source/plugins/skyline/README.md" title="🌇 GitHub Skyline">🌇</a> <a href="/source/plugins/sponsors/README.md" title="💕 GitHub Sponsors">💕</a> <a href="/source/plugins/stackoverflow/README.md" title="🗨️ Stack Overflow">🗨️</a> <a href="/source/plugins/stargazers/README.md" title="✨ Stargazers">✨</a> <a href="/source/plugins/starlists/README.md" title="💫 Star lists">💫</a> <a href="/source/plugins/stars/README.md" title="🌟 Recently starred repositories">🌟</a> <a href="/source/plugins/support/README.md" title="💭 GitHub Community Support">💭</a> <a href="/source/plugins/topics/README.md" title="📌 Starred topics">📌</a> <a href="/source/plugins/traffic/README.md" title="🧮 Repositories traffic">🧮</a> <a href="/source/plugins/tweets/README.md" title="🐤 Latest tweets">🐤</a> <a href="/source/plugins/wakatime/README.md" title="⏰ WakaTime">⏰</a></td>
+    <td><a href="/source/plugins/achievements/README.md" title="🏆 Achievements">🏆</a> <a href="/source/plugins/activity/README.md" title="📰 Recent activity">📰</a> <a href="/source/plugins/anilist/README.md" title="🌸 Anilist watch list and reading list">🌸</a> <a href="/source/plugins/calendar/README.md" title="📆 Commit calendar">📆</a> <a href="/source/plugins/code/README.md" title="♐ Random code snippet">♐</a> <a href="/source/plugins/chess/README.md" title="♟️ Chess">♟️</a> <a href="/source/plugins/fortune/README.md" title="🥠 Fortune">🥠</a> <a href="/source/plugins/nightscout/README.md" title="💉 Nightscout">💉</a> <a href="/source/plugins/poopmap/README.md" title="💩 PoopMap plugin">💩</a> <a href="/source/plugins/screenshot/README.md" title="📸 Website screenshot">📸</a> <a href="/source/plugins/splatoon/README.md" title="🦑 Splatoon">🦑</a> <a href="/source/plugins/stock/README.md" title="💹 Stock prices">💹</a> <a href="/source/plugins/discussions/README.md" title="💬 Discussions">💬</a> <a href="/source/plugins/followup/README.md" title="🎟️ Follow-up of issues and pull requests">🎟️</a> <a href="/source/plugins/gists/README.md" title="🎫 Gists">🎫</a> <a href="/source/plugins/habits/README.md" title="💡 Coding habits and activity">💡</a> <a href="/source/plugins/introduction/README.md" title="🙋 Introduction">🙋</a> <a href="/source/plugins/isocalendar/README.md" title="📅 Isometric commit calendar">📅</a> <a href="/source/plugins/languages/README.md" title="🈷️ Languages activity">🈷️</a> <a href="/source/plugins/leetcode/README.md" title="🗳️ Leetcode">🗳️</a> <a href="/source/plugins/lines/README.md" title="👨‍💻 Lines of code changed">👨‍💻</a> <a href="/source/plugins/music/README.md" title="🎼 Music activity and suggestions">🎼</a> <a href="/source/plugins/notable/README.md" title="🎩 Notable contributions">🎩</a> <a href="/source/plugins/pagespeed/README.md" title="⏱️ Google PageSpeed">⏱️</a> <a href="/source/plugins/people/README.md" title="🧑‍🤝‍🧑 People">🧑‍🤝‍🧑</a> <a href="/source/plugins/posts/README.md" title="✒️ Recent posts">✒️</a> <a href="/source/plugins/projects/README.md" title="🗂️ GitHub projects">🗂️</a> <a href="/source/plugins/reactions/README.md" title="🎭 Comment reactions">🎭</a> <a href="/source/plugins/repositories/README.md" title="📓 Featured repositories">📓</a> <a href="/source/plugins/rss/README.md" title="🗼 Rss feed">🗼</a> <a href="/source/plugins/skyline/README.md" title="🌇 GitHub Skyline">🌇</a> <a href="/source/plugins/sponsors/README.md" title="💕 GitHub Sponsors">💕</a> <a href="/source/plugins/sponsorships/README.md" title="💝 GitHub Sponsorships">💝</a> <a href="/source/plugins/stackoverflow/README.md" title="🗨️ Stack Overflow">🗨️</a> <a href="/source/plugins/stargazers/README.md" title="✨ Stargazers">✨</a> <a href="/source/plugins/starlists/README.md" title="💫 Star lists">💫</a> <a href="/source/plugins/stars/README.md" title="🌟 Recently starred repositories">🌟</a> <a href="/source/plugins/support/README.md" title="💭 GitHub Community Support">💭</a> <a href="/source/plugins/topics/README.md" title="📌 Starred topics">📌</a> <a href="/source/plugins/traffic/README.md" title="🧮 Repositories traffic">🧮</a> <a href="/source/plugins/tweets/README.md" title="🐤 Latest tweets">🐤</a> <a href="/source/plugins/wakatime/README.md" title="⏰ WakaTime">⏰</a></td>
   </tr>
   <tr>
     <td><code>👤 Users</code> <code>👥 Organizations</code></td>
diff --git a/tests/cases/sponsorships.plugin.yml b/tests/cases/sponsorships.plugin.yml
new file mode 100644
index 00000000000..5dc5ff73af5
--- /dev/null
+++ b/tests/cases/sponsorships.plugin.yml
@@ -0,0 +1,7 @@
+- name: 💝 GitHub Sponsorships - 💝 GitHub sponsorships
+  uses: lowlighter/metrics@latest
+  with:
+    token: MOCKED_TOKEN
+    plugin_sponsorships: 'yes'
+    use_mocked_data: 'yes'
+    verify: 'yes'

From 381306aae44a77dd61a83c51aa193e5a2b4627bf Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 17 Jan 2023 12:40:54 -0500
Subject: [PATCH 066/196] ci: update sponsorships example token [skip test]

---
 .../partials/documentation/compatibility.md   | 36 +++++------
 .github/workflows/examples.yml                | 62 +++++++++----------
 README.md                                     | 16 ++---
 action.yml                                    | 40 ++++++------
 settings.example.json                         | 10 +--
 source/plugins/introduction/metadata.yml      |  2 +-
 source/plugins/skyline/metadata.yml           |  2 +-
 source/plugins/sponsorships/README.md         |  4 +-
 source/plugins/sponsorships/examples.yml      |  4 +-
 source/plugins/sponsorships/metadata.yml      |  1 +
 tests/cases/sponsorships.plugin.yml           |  2 +-
 11 files changed, 90 insertions(+), 89 deletions(-)

diff --git a/.github/readme/partials/documentation/compatibility.md b/.github/readme/partials/documentation/compatibility.md
index 400b3483127..3923c6c5668 100644
--- a/.github/readme/partials/documentation/compatibility.md
+++ b/.github/readme/partials/documentation/compatibility.md
@@ -16,7 +16,7 @@
     <th nowrap="nowrap" align="center" title="🎟️ Follow-up of issues and pull requests">🎟️</th>
     <th nowrap="nowrap" align="center" title="🎭 Comment reactions">🎭</th>
     <th nowrap="nowrap" align="center" title="🧑‍🤝‍🧑 People">🧑‍🤝‍🧑</th>
-    <th nowrap="nowrap" align="center" title="🙋 Introduction">🙋</th>
+    <th nowrap="nowrap" align="center" title="💝 GitHub Sponsorships">💝</th>
     <th nowrap="nowrap" align="center" title="💕 GitHub Sponsors">💕</th>
     <th nowrap="nowrap" align="center" title="📓 Featured repositories">📓</th>
     <th nowrap="nowrap" align="center" title="💬 Discussions">💬</th>
@@ -29,8 +29,8 @@
     <th nowrap="nowrap" align="center" title="♐ Random code snippet">♐</th>
     <th nowrap="nowrap" align="center" title="🎫 Gists">🎫</th>
     <th nowrap="nowrap" align="center" title="🗂️ GitHub projects">🗂️</th>
+    <th nowrap="nowrap" align="center" title="🙋 Introduction">🙋</th>
     <th nowrap="nowrap" align="center" title="🌇 GitHub Skyline">🌇</th>
-    <th nowrap="nowrap" align="center" title="💝 GitHub Sponsorships">💝</th>
     <th nowrap="nowrap" align="center" title="💭 GitHub Community Support">💭</th>
     <th nowrap="nowrap" align="center" title="⏱️ Google PageSpeed">⏱️</th>
     <th nowrap="nowrap" align="center" title="🐤 Latest tweets">🐤</th>
@@ -57,7 +57,7 @@
     <td nowrap="nowrap" align="center" data-plugin="followup">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="reactions">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="people">✔️</td>
-    <td nowrap="nowrap" align="center" data-plugin="introduction">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="sponsors">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="repositories">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="discussions">✔️</td>
@@ -70,8 +70,8 @@
     <td nowrap="nowrap" align="center" data-plugin="code">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="gists">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="introduction">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">✔️</td>
-    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="support">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">✔️</td>
@@ -98,7 +98,7 @@
     <td nowrap="nowrap" align="center" data-plugin="followup">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="reactions">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="people">✔️</td>
-    <td nowrap="nowrap" align="center" data-plugin="introduction">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="sponsors">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="repositories">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="discussions">❌</td>
@@ -111,8 +111,8 @@
     <td nowrap="nowrap" align="center" data-plugin="code">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="gists">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="introduction">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">❌</td>
-    <td nowrap="nowrap" align="center" data-plugin="sponsorships">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="support">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">❌</td>
@@ -139,7 +139,7 @@
     <td nowrap="nowrap" align="center" data-plugin="followup">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="reactions">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="people">❌</td>
-    <td nowrap="nowrap" align="center" data-plugin="introduction">❌</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="sponsors">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="repositories">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="discussions">❌</td>
@@ -152,8 +152,8 @@
     <td nowrap="nowrap" align="center" data-plugin="code">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="gists">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">❌</td>
+    <td nowrap="nowrap" align="center" data-plugin="introduction">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">❌</td>
-    <td nowrap="nowrap" align="center" data-plugin="sponsorships">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="support">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">❌</td>
@@ -180,7 +180,7 @@
     <td nowrap="nowrap" align="center" data-plugin="followup">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="reactions">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="people">✓</td>
-    <td nowrap="nowrap" align="center" data-plugin="introduction">✓</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="sponsors">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="repositories">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="discussions">✓</td>
@@ -193,8 +193,8 @@
     <td nowrap="nowrap" align="center" data-plugin="code">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="gists">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✓</td>
+    <td nowrap="nowrap" align="center" data-plugin="introduction">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">✓</td>
-    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="support">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">✔️</td>
@@ -224,7 +224,7 @@
     <th nowrap="nowrap" align="center" title="🎟️ Follow-up of issues and pull requests">🎟️</th>
     <th nowrap="nowrap" align="center" title="🎭 Comment reactions">🎭</th>
     <th nowrap="nowrap" align="center" title="🧑‍🤝‍🧑 People">🧑‍🤝‍🧑</th>
-    <th nowrap="nowrap" align="center" title="🙋 Introduction">🙋</th>
+    <th nowrap="nowrap" align="center" title="💝 GitHub Sponsorships">💝</th>
     <th nowrap="nowrap" align="center" title="💕 GitHub Sponsors">💕</th>
     <th nowrap="nowrap" align="center" title="📓 Featured repositories">📓</th>
     <th nowrap="nowrap" align="center" title="💬 Discussions">💬</th>
@@ -237,8 +237,8 @@
     <th nowrap="nowrap" align="center" title="♐ Random code snippet">♐</th>
     <th nowrap="nowrap" align="center" title="🎫 Gists">🎫</th>
     <th nowrap="nowrap" align="center" title="🗂️ GitHub projects">🗂️</th>
+    <th nowrap="nowrap" align="center" title="🙋 Introduction">🙋</th>
     <th nowrap="nowrap" align="center" title="🌇 GitHub Skyline">🌇</th>
-    <th nowrap="nowrap" align="center" title="💝 GitHub Sponsorships">💝</th>
     <th nowrap="nowrap" align="center" title="💭 GitHub Community Support">💭</th>
     <th nowrap="nowrap" align="center" title="⏱️ Google PageSpeed">⏱️</th>
     <th nowrap="nowrap" align="center" title="🐤 Latest tweets">🐤</th>
@@ -265,7 +265,7 @@
     <td nowrap="nowrap" align="center" data-plugin="followup">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="reactions">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="people">✔️</td>
-    <td nowrap="nowrap" align="center" data-plugin="introduction">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="sponsors">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="repositories">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="discussions">✔️</td>
@@ -278,8 +278,8 @@
     <td nowrap="nowrap" align="center" data-plugin="code">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="gists">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="introduction">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">✔️</td>
-    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="support">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">✔️</td>
@@ -306,7 +306,7 @@
     <td nowrap="nowrap" align="center" data-plugin="followup">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="reactions">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="people">✔️</td>
-    <td nowrap="nowrap" align="center" data-plugin="introduction">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="sponsors">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="repositories">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="discussions">❌</td>
@@ -319,8 +319,8 @@
     <td nowrap="nowrap" align="center" data-plugin="code">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="gists">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="introduction">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">❌</td>
-    <td nowrap="nowrap" align="center" data-plugin="sponsorships">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="support">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">✔️</td>
@@ -347,7 +347,7 @@
     <td nowrap="nowrap" align="center" data-plugin="followup">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="reactions">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="people">✔️</td>
-    <td nowrap="nowrap" align="center" data-plugin="introduction">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="sponsorships">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="sponsors">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="repositories">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="discussions">❌</td>
@@ -360,8 +360,8 @@
     <td nowrap="nowrap" align="center" data-plugin="code">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="gists">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="projects">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="introduction">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="skyline">❌</td>
-    <td nowrap="nowrap" align="center" data-plugin="sponsorships">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="support">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="pagespeed">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="tweets">❌</td>
diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 1321dc359f9..4e50ebac74b 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -506,27 +506,13 @@ jobs:
           user: lowlighter
           plugins_errors_fatal: yes
         if: ${{ success() || failure() }}
-      - name: 🙋 Introduction - Organization introduction
+      - name: 💝 GitHub Sponsorships - 💝 GitHub Sponsorships
         uses: lowlighter/metrics@master
         with:
-          filename: metrics.plugin.introduction.svg
-          token: ${{ secrets.METRICS_TOKEN_WITH_SCOPES }}
-          user: github
-          base: header
-          plugin_introduction: yes
-          output_action: none
-          delay: 120
-          plugins_errors_fatal: yes
-        if: ${{ success() || failure() }}
-      - name: 🙋 Introduction - Repository introduction
-        uses: lowlighter/metrics@master
-        with:
-          filename: metrics.plugin.introduction.repository.svg
-          token: ${{ secrets.METRICS_TOKEN }}
-          template: repository
-          repo: metrics
-          base: header
-          plugin_introduction: yes
+          filename: metrics.plugin.sponsorships.svg
+          token: ${{ secrets.METRICS_TOKEN_PERSONAL }}
+          base: ""
+          plugin_sponsorships: yes
           output_action: none
           delay: 120
           user: lowlighter
@@ -775,6 +761,32 @@ jobs:
           user: lowlighter
           plugins_errors_fatal: yes
         if: ${{ success() || failure() }}
+      - name: 🙋 Introduction - Organization introduction
+        uses: lowlighter/metrics@master
+        with:
+          filename: metrics.plugin.introduction.svg
+          token: ${{ secrets.METRICS_TOKEN_WITH_SCOPES }}
+          user: github
+          base: header
+          plugin_introduction: yes
+          output_action: none
+          delay: 120
+          plugins_errors_fatal: yes
+        if: ${{ success() || failure() }}
+      - name: 🙋 Introduction - Repository introduction
+        uses: lowlighter/metrics@master
+        with:
+          filename: metrics.plugin.introduction.repository.svg
+          token: ${{ secrets.METRICS_TOKEN }}
+          template: repository
+          repo: metrics
+          base: header
+          plugin_introduction: yes
+          output_action: none
+          delay: 120
+          user: lowlighter
+          plugins_errors_fatal: yes
+        if: ${{ success() || failure() }}
       - name: 🌇 GitHub Skyline - GitHub Skyline
         uses: lowlighter/metrics@master
         with:
@@ -812,18 +824,6 @@ jobs:
           user: lowlighter
           plugins_errors_fatal: yes
         if: ${{ success() || failure() }}
-      - name: 💝 GitHub Sponsorships - 💝 GitHub sponsorships
-        uses: lowlighter/metrics@master
-        with:
-          filename: metrics.plugin.sponsorships.svg
-          token: ${{ secrets.METRICS_TOKEN }}
-          base: ""
-          plugin_sponsorships: yes
-          output_action: none
-          delay: 120
-          user: lowlighter
-          plugins_errors_fatal: yes
-        if: ${{ success() || failure() }}
       - name: ⏱️ Google PageSpeed - Succinct report
         uses: lowlighter/metrics@master
         with:
diff --git a/README.md b/README.md
index 4ddae2988f1..ea353a6efca 100644
--- a/README.md
+++ b/README.md
@@ -121,13 +121,12 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
       </td>
   </tr>
   <tr>
-    <th><a href="source/plugins/introduction/README.md">🙋 Introduction</a></th>
+    <th><a href="source/plugins/sponsorships/README.md">💝 GitHub Sponsorships</a></th>
     <th><a href="source/plugins/sponsors/README.md">💕 GitHub Sponsors</a></th>
   </tr>
   <tr>
         <td  align="center">
-        <details open><summary>For a user or an organization</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.introduction.svg" alt=""></img></details>
-        <details><summary>For a repository</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.introduction.repository.svg" alt=""></img></details>
+        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.sponsorships.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </td>
         <td  align="center">
@@ -213,7 +212,7 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
   </tr>
   <tr>
     <th><a href="source/plugins/projects/README.md">🗂️ GitHub projects</a></th>
-    <th><a href="source/plugins/skyline/README.md">🌇 GitHub Skyline</a></th>
+    <th><a href="source/plugins/introduction/README.md">🙋 Introduction</a></th>
   </tr>
   <tr>
         <td  align="center">
@@ -221,18 +220,19 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
         <img width="900" height="1" alt="">
       </td>
         <td  align="center">
-        <details open><summary>GitHub Skyline</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.skyline.svg" alt=""></img></details>
-        <details><summary>GitHub City</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.skyline.city.svg" alt=""></img></details>
+        <details open><summary>For a user or an organization</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.introduction.svg" alt=""></img></details>
+        <details><summary>For a repository</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.introduction.repository.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
   </tr>
   <tr>
-    <th><a href="source/plugins/sponsorships/README.md">💝 GitHub Sponsorships</a></th>
+    <th><a href="source/plugins/skyline/README.md">🌇 GitHub Skyline</a></th>
     <th><a href="source/plugins/pagespeed/README.md">⏱️ Google PageSpeed</a></th>
   </tr>
   <tr>
         <td  align="center">
-        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.sponsorships.svg" alt=""></img>
+        <details open><summary>GitHub Skyline</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.skyline.svg" alt=""></img></details>
+        <details><summary>GitHub City</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.skyline.city.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
         <td  align="center">
diff --git a/action.yml b/action.yml
index 52229a1764e..64976d2042c 100644
--- a/action.yml
+++ b/action.yml
@@ -612,14 +612,18 @@ inputs:
     default: <default-value>
 
   # ====================================================================================
-  # 🙋 Introduction
+  # 💝 GitHub Sponsorships
 
-  plugin_introduction:
-    description: Enable introduction plugin
+  plugin_sponsorships:
+    description: Enable sponsorships plugin
     default: <default-value>
 
-  plugin_introduction_title:
-    description: Section title
+  plugin_sponsorships_sections:
+    description: Displayed sections
+    default: <default-value>
+
+  plugin_sponsorships_size:
+    description: Profile picture display size
     default: <default-value>
 
   # ====================================================================================
@@ -922,6 +926,17 @@ inputs:
     description: Projects descriptions
     default: <default-value>
 
+  # ====================================================================================
+  # 🙋 Introduction
+
+  plugin_introduction:
+    description: Enable introduction plugin
+    default: <default-value>
+
+  plugin_introduction_title:
+    description: Section title
+    default: <default-value>
+
   # ====================================================================================
   # 🌇 GitHub Skyline
 
@@ -949,21 +964,6 @@ inputs:
     description: Advanced settings
     default: <default-value>
 
-  # ====================================================================================
-  # 💝 GitHub Sponsorships
-
-  plugin_sponsorships:
-    description: Enable sponsorships plugin
-    default: <default-value>
-
-  plugin_sponsorships_sections:
-    description: Displayed sections
-    default: <default-value>
-
-  plugin_sponsorships_size:
-    description: Profile picture display size
-    default: <default-value>
-
   # ====================================================================================
   # 💭 GitHub Community Support
 
diff --git a/settings.example.json b/settings.example.json
index ec11abd158c..b106ec69dc4 100644
--- a/settings.example.json
+++ b/settings.example.json
@@ -101,8 +101,8 @@
     "people":{
       "enabled": false,                 "//": "Enable people plugin"
     },
-    "introduction":{
-      "enabled": false,                 "//": "Enable introduction plugin"
+    "sponsorships":{
+      "enabled": false,                 "//": "Enable sponsorships plugin"
     },
     "sponsors":{
       "enabled": false,                 "//": "Enable sponsors plugin"
@@ -140,12 +140,12 @@
     "projects":{
       "enabled": false,                 "//": "Enable projects plugin"
     },
+    "introduction":{
+      "enabled": false,                 "//": "Enable introduction plugin"
+    },
     "skyline":{
       "enabled": false,                 "//": "Enable skyline plugin"
     },
-    "sponsorships":{
-      "enabled": false,                 "//": "Enable sponsorships plugin"
-    },
     "support":{
       "enabled": false,                 "//": "Enable support plugin"
     },
diff --git a/source/plugins/introduction/metadata.yml b/source/plugins/introduction/metadata.yml
index 3d794cacf66..842687c64ea 100644
--- a/source/plugins/introduction/metadata.yml
+++ b/source/plugins/introduction/metadata.yml
@@ -7,7 +7,7 @@ description: |
 examples:
   +for a user or an organization: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.introduction.svg
   for a repository: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.introduction.repository.svg
-index: 12
+index: 26
 supports:
   - user
   - organization
diff --git a/source/plugins/skyline/metadata.yml b/source/plugins/skyline/metadata.yml
index 31158d767ef..e99cde40d4e 100644
--- a/source/plugins/skyline/metadata.yml
+++ b/source/plugins/skyline/metadata.yml
@@ -7,7 +7,7 @@ notes: |
 examples:
   +GitHub Skyline: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.skyline.svg
   GitHub City: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.skyline.city.svg
-index: 26
+index: 27
 supports:
   - user
 scopes: []
diff --git a/source/plugins/sponsorships/README.md b/source/plugins/sponsorships/README.md
index 5194d117597..d23645a7149 100644
--- a/source/plugins/sponsorships/README.md
+++ b/source/plugins/sponsorships/README.md
@@ -82,11 +82,11 @@ All product and company names are trademarks™ or registered® trademarks of th
 
 <!--examples-->
 ```yaml
-name: 💝 GitHub sponsorships
+name: 💝 GitHub Sponsorships
 uses: lowlighter/metrics@latest
 with:
   filename: metrics.plugin.sponsorships.svg
-  token: ${{ secrets.METRICS_TOKEN }}
+  token: ${{ secrets.METRICS_TOKEN_PERSONAL }}
   base: ""
   plugin_sponsorships: yes
 
diff --git a/source/plugins/sponsorships/examples.yml b/source/plugins/sponsorships/examples.yml
index d5a04ee68b4..51d88056df6 100644
--- a/source/plugins/sponsorships/examples.yml
+++ b/source/plugins/sponsorships/examples.yml
@@ -1,7 +1,7 @@
-- name: 💝 GitHub sponsorships
+- name: 💝 GitHub Sponsorships
   uses: lowlighter/metrics@latest
   with:
     filename: metrics.plugin.sponsorships.svg
-    token: ${{ secrets.METRICS_TOKEN }}
+    token: ${{ secrets.METRICS_TOKEN_PERSONAL }}
     base: ""
     plugin_sponsorships: yes
diff --git a/source/plugins/sponsorships/metadata.yml b/source/plugins/sponsorships/metadata.yml
index 2ccd6d2ce00..82ea27f4ad4 100644
--- a/source/plugins/sponsorships/metadata.yml
+++ b/source/plugins/sponsorships/metadata.yml
@@ -4,6 +4,7 @@ description: |
   This plugin displays sponsorships funded through [GitHub sponsors](https://github.com/sponsors/).
 examples:
   default: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.sponsorships.svg
+index: 12
 supports:
   - user
   - organization
diff --git a/tests/cases/sponsorships.plugin.yml b/tests/cases/sponsorships.plugin.yml
index 5dc5ff73af5..094f82e1e59 100644
--- a/tests/cases/sponsorships.plugin.yml
+++ b/tests/cases/sponsorships.plugin.yml
@@ -1,4 +1,4 @@
-- name: 💝 GitHub Sponsorships - 💝 GitHub sponsorships
+- name: 💝 GitHub Sponsorships - 💝 GitHub Sponsorships
   uses: lowlighter/metrics@latest
   with:
     token: MOCKED_TOKEN

From 1b67453fc4b931e70b1e83940e522cee855e5b96 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 17 Jan 2023 12:42:26 -0500
Subject: [PATCH 067/196] ci: trigger


From 6b0303bbb469013e0950cec530ee6df9e6be762c Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 18 Jan 2023 00:29:53 -0500
Subject: [PATCH 068/196] chore: prepare release v3.32 (#1359) [skip ci]

---
 package-lock.json | 4 ++--
 package.json      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b23111f2c23..ef4bee5d8ba 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "metrics",
-  "version": "3.32.0-beta",
+  "version": "3.32.0",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "metrics",
-      "version": "3.32.0-beta",
+      "version": "3.32.0",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index ab4462a0aac..0a3015a900e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "metrics",
-  "version": "3.32.0-beta",
+  "version": "3.32.0",
   "description": "An infographics generator with 40+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!",
   "main": "index.mjs",
   "scripts": {

From d863ef7281c93ec8c3f23dbf7d42ede3f6f68201 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 18 Jan 2023 00:31:02 -0500
Subject: [PATCH 069/196] ci: auto-regenerate files

---
 README.md | 2 --
 1 file changed, 2 deletions(-)

diff --git a/README.md b/README.md
index ea353a6efca..fb07193cb34 100644
--- a/README.md
+++ b/README.md
@@ -432,8 +432,6 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
 # 📚 Documentation
 
 
-> <sup>*⚠️ This is the documentation of **v3.32-beta** (`@master`/`@main` branches) which includes [unreleased features](https://github.com/lowlighter/metrics/compare/latest...master) planned for next release. See documentation for current released version [**v3.31** (`@latest` branch) here](https://github.com/lowlighter/metrics/blob/latest/README.md).* </sup>
-
 
 
 ## 🦮 Setup

From 3dd06164327476b9730a815a70ad39cbf5032f7e Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 18 Jan 2023 00:31:20 -0500
Subject: [PATCH 070/196] Release v3.32 [release]


From 1d9a7abd2088da28b61aed9de82876ebef652361 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 18 Jan 2023 21:56:55 -0500
Subject: [PATCH 071/196] chore: create version 3.33-beta

---
 package-lock.json                          | 13 +++----------
 package.json                               |  2 +-
 source/app/web/statics/embed/index.html    |  8 ++++----
 source/app/web/statics/index.html          |  6 +++---
 source/app/web/statics/insights/index.html |  8 ++++----
 source/app/web/statics/oauth/index.html    |  8 ++++----
 6 files changed, 19 insertions(+), 26 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index ef4bee5d8ba..3119bc8c1b5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,28 +1,25 @@
 {
   "name": "metrics",
-  "version": "3.32.0",
+  "version": "3.33.0-beta",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
       "name": "metrics",
-      "version": "3.32.0",
+      "version": "3.33.0-beta",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
         "@actions/core": "^1.10.0",
         "@actions/github": "^5.1.1",
         "@faker-js/faker": "^7.6.0",
-        "@googlemaps/google-maps-services-js": "^3.3.26",
         "@octokit/graphql": "^5.0.4",
         "@octokit/rest": "^19.0.5",
         "@primer/css": "^20.8.0",
         "@primer/octicons": "^17.10.2",
         "@twemoji/parser": "^14.1.0",
         "axios": "^1.2.2",
-        "chess.js": "^1.0.0-beta.1",
         "clipboard": "^2.0.11",
-        "color": "^4.2.3",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
         "d3": "^7.8.1",
@@ -31,21 +28,18 @@
         "express": "^4.18.2",
         "express-rate-limit": "^6.7.0",
         "file-type": "^18.2.0",
-        "gifencoder": "^2.0.1",
         "js-yaml": "^4.1.0",
         "jsdom": "^21.0.0",
         "linguist-js": "^2.5.4",
         "marked": "^4.2.12",
         "memory-cache": "^0.2.0",
         "minimatch": "^6.0.4",
-        "node-chartist": "^1.0.5",
         "node-fetch": "^3.3.0",
         "open-graph-scraper": "^5.0.3",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
         "puppeteer": "^19.5.2",
         "purgecss": "^5.0.0",
-        "rss": "^1.2.2",
         "rss-parser": "^3.12.0",
         "sanitize-html": "^2.8.1",
         "sharp": "^0.31.3",
@@ -53,8 +47,7 @@
         "svgo": "^3.0.2",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
-        "xml-formatter": "^3.2.0",
-        "yargs-parser": "^21.1.1"
+        "xml-formatter": "^3.2.0"
       },
       "devDependencies": {
         "eslint": "^8.32.0",
diff --git a/package.json b/package.json
index 0a3015a900e..c73ef0a42af 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "metrics",
-  "version": "3.32.0",
+  "version": "3.33.0-beta",
   "description": "An infographics generator with 40+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!",
   "main": "index.mjs",
   "scripts": {
diff --git a/source/app/web/statics/embed/index.html b/source/app/web/statics/embed/index.html
index 6d05e80b446..33b6153f083 100644
--- a/source/app/web/statics/embed/index.html
+++ b/source/app/web/statics/embed/index.html
@@ -8,8 +8,8 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.32">
-    <link rel="stylesheet" href="/.css/style.css?v=3.32">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.33">
+    <link rel="stylesheet" href="/.css/style.css?v=3.33">
     <link rel="stylesheet" href="/.css/style.prism.css" />
   </head>
   <body>
@@ -230,7 +230,7 @@
     <script src="/.js/vue.min.js"></script>
     <script src="/.js/vue.prism.min.js"></script>
     <script src="/.js/clipboard.min.js"></script>
-    <script src="/.js/embed/app.placeholder.js?v=3.32"></script>
-    <script src="/.js/embed/app.js?v=3.32"></script>
+    <script src="/.js/embed/app.placeholder.js?v=3.33"></script>
+    <script src="/.js/embed/app.js?v=3.33"></script>
   </body>
 </html>
\ No newline at end of file
diff --git a/source/app/web/statics/index.html b/source/app/web/statics/index.html
index 44a7349620a..5832178c862 100644
--- a/source/app/web/statics/index.html
+++ b/source/app/web/statics/index.html
@@ -8,8 +8,8 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.32">
-    <link rel="stylesheet" href="/.css/style.css?v=3.32">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.33">
+    <link rel="stylesheet" href="/.css/style.css?v=3.33">
   </head>
   <body>
     <!-- Vue app -->
@@ -100,6 +100,6 @@ <h2>
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/.js/app.js?v=3.32"></script>
+    <script src="/.js/app.js?v=3.33"></script>
   </body>
 </html>
\ No newline at end of file
diff --git a/source/app/web/statics/insights/index.html b/source/app/web/statics/insights/index.html
index 69f503d6937..497c0af58cf 100644
--- a/source/app/web/statics/insights/index.html
+++ b/source/app/web/statics/insights/index.html
@@ -8,9 +8,9 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.32">
-    <link rel="stylesheet" href="/.css/style.css?v=3.32">
-    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.32">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.33">
+    <link rel="stylesheet" href="/.css/style.css?v=3.33">
+    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.33">
   </head>
   <body>
     <!-- Vue app -->
@@ -601,6 +601,6 @@ <h2>
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/insights/.statics/script.js?v=3.32"></script>
+    <script src="/insights/.statics/script.js?v=3.33"></script>
   </body>
 </html>
diff --git a/source/app/web/statics/oauth/index.html b/source/app/web/statics/oauth/index.html
index 7c1fb1a5e47..a0d63e6e3dc 100644
--- a/source/app/web/statics/oauth/index.html
+++ b/source/app/web/statics/oauth/index.html
@@ -8,9 +8,9 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.32">
-    <link rel="stylesheet" href="/.css/style.css?v=3.32">
-    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.32">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.33">
+    <link rel="stylesheet" href="/.css/style.css?v=3.33">
+    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.33">
   </head>
   <body>
     <!-- Vue app -->
@@ -105,6 +105,6 @@
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/.oauth/script.js?v=3.32"></script>
+    <script src="/.oauth/script.js?v=3.33"></script>
   </body>
 </html>

From 74055a485d0c87c1965fabe6ed2df3f633cdedfc Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 19 Jan 2023 00:05:38 -0500
Subject: [PATCH 072/196] test(plugins/community/splatoon): mocks

---
 .github/workflows/examples.yml                |  17 -
 .../plugins/community/splatoon/examples.yml   |   6 +-
 source/plugins/community/splatoon/index.mjs   |   5 +-
 .../plugins/community/splatoon/metadata.yml   |   2 +
 .../community/splatoon/s3si/mocks/u_coop.json | 457 ++++++++++++++
 .../splatoon/s3si/mocks/u_summary.json        | 352 +++++++++++
 .../community/splatoon/s3si/mocks/u_vs.json   | 576 ++++++++++++++++++
 .../templates/classic/partials/splatoon.ejs   |   1 +
 8 files changed, 1395 insertions(+), 21 deletions(-)
 create mode 100644 source/plugins/community/splatoon/s3si/mocks/u_coop.json
 create mode 100644 source/plugins/community/splatoon/s3si/mocks/u_summary.json
 create mode 100644 source/plugins/community/splatoon/s3si/mocks/u_vs.json

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 4e50ebac74b..0233f9f93b9 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -1163,23 +1163,6 @@ jobs:
           user: lowlighter
           plugins_errors_fatal: yes
         if: ${{ success() || failure() }}
-      - name: 🦑 Splatoon - Splatnet data with stat.ink integration
-        uses: lowlighter/metrics@master
-        with:
-          filename: metrics.plugin.splatoon.svg
-          token: ${{ secrets.METRICS_TOKEN }}
-          base: ""
-          plugin_splatoon: yes
-          plugin_splatoon_token: ${{ secrets.SPLATOON_TOKEN }}
-          plugin_splatoon_statink: yes
-          plugin_splatoon_statink_token: ${{ secrets.SPLATOON_STATINK_TOKEN }}
-          extras_css: |
-            h2 { display: none !important; }
-          output_action: none
-          delay: 120
-          user: lowlighter
-          plugins_errors_fatal: yes
-        if: ${{ success() || failure() }}
       - name: 💹 Stock prices - Stock prices from Tesla
         uses: lowlighter/metrics@master
         with:
diff --git a/source/plugins/community/splatoon/examples.yml b/source/plugins/community/splatoon/examples.yml
index 1b671c80ddb..ef2617d1481 100644
--- a/source/plugins/community/splatoon/examples.yml
+++ b/source/plugins/community/splatoon/examples.yml
@@ -2,7 +2,7 @@
   uses: lowlighter/metrics@latest
   with:
     filename: metrics.plugin.splatoon.svg
-    token: ${{ secrets.METRICS_TOKEN }}
+    token: NOT_NEEDED
     base: ""
     plugin_splatoon: yes
     plugin_splatoon_token: ${{ secrets.SPLATOON_TOKEN }}
@@ -15,7 +15,7 @@
   uses: lowlighter/metrics@latest
   with:
     filename: metrics.plugin.splatoon.svg
-    token: ${{ secrets.METRICS_TOKEN }}
+    token: NOT_NEEDED
     base: ""
     plugin_splatoon: yes
     plugin_splatoon_token: ${{ secrets.SPLATOON_TOKEN }}
@@ -25,3 +25,5 @@
       h2 { display: none !important; }
   test:
     skip: true
+  prod:
+    skip: true
\ No newline at end of file
diff --git a/source/plugins/community/splatoon/index.mjs b/source/plugins/community/splatoon/index.mjs
index a130c071c1d..95cc5bdcb26 100644
--- a/source/plugins/community/splatoon/index.mjs
+++ b/source/plugins/community/splatoon/index.mjs
@@ -44,6 +44,7 @@ export default async function({login, q, imports, data, account}, {enabled = fal
       allowed.net.push("stat.ink")
     }
     switch (source) {
+      case "mocks":
       case "local":
         console.debug(`metrics/compute/${login}/plugins > splatoon > skipping s3si execution`)
         break
@@ -54,8 +55,8 @@ export default async function({login, q, imports, data, account}, {enabled = fal
 
     //Read fetched data
     const exported = await Promise.all(
-      (await imports.fs.readdir(`${imports.__module(import.meta.url)}/s3si/export`))
-        .map(async file => JSON.parse(await imports.fs.readFile(`${imports.__module(import.meta.url)}/s3si/export/${file}`))),
+      (await imports.fs.readdir(`${imports.__module(import.meta.url)}/s3si/${source == "mocks" ? "mocks" : "export"}`))
+        .map(async file => JSON.parse(await imports.fs.readFile(`${imports.__module(import.meta.url)}/s3si/${source == "mocks" ? "mocks" : "export"}/${file}`))),
     )
     const summary = exported.filter(({type}) => type === "SUMMARY").at(0)
     if (!summary)
diff --git a/source/plugins/community/splatoon/metadata.yml b/source/plugins/community/splatoon/metadata.yml
index 86d65662742..ee3cf048629 100644
--- a/source/plugins/community/splatoon/metadata.yml
+++ b/source/plugins/community/splatoon/metadata.yml
@@ -90,10 +90,12 @@ inputs:
 
       - `splatnet` will fetch data from Splatnet using [spacemeowx2/s3si.ts](https://github.com/spacemeowx2/s3si.ts) tool
       - `local` will assume `s3si/export` directory already exists and is populated (use this when developping new features for this plugin to save network resources and time)
+      - `mocks` will use `s3si/mocks` directory (use this when developping new features for this plugin to avoid setting up a NSO token)
     type: string
     default: splatnet
     values:
       - splatnet
       - local
+      - mocks
     testing: yes
     preset: no
diff --git a/source/plugins/community/splatoon/s3si/mocks/u_coop.json b/source/plugins/community/splatoon/s3si/mocks/u_coop.json
new file mode 100644
index 00000000000..88ec8245f02
--- /dev/null
+++ b/source/plugins/community/splatoon/s3si/mocks/u_coop.json
@@ -0,0 +1,457 @@
+{
+  "type": "COOP",
+  "exportTime": "2023-01-19T00:00:00.000Z",
+  "data": {
+    "type": "CoopInfo",
+    "listNode": {
+      "weapons": [
+        {
+          "name": "Random",
+          "image": {
+            "url": {
+              "pathname": "#"
+            }
+          }
+        },
+        {
+          "name": "Random",
+          "image": {
+            "url": {
+              "pathname": "#"
+            }
+          }
+        },
+        {
+          "name": "Random",
+          "image": {
+            "url": {
+              "pathname": "#"
+            }
+          }
+        },
+        {
+          "name": "Random",
+          "image": {
+            "url": {
+              "pathname": "#"
+            }
+          }
+        }
+      ],
+      "nextHistoryDetail": {},
+      "previousHistoryDetail": {},
+      "resultWave": 3,
+      "coopStage": {
+        "name": "Marooner's Bay"
+      },
+      "afterGrade": {
+        "name": "Eggsecutive VP"
+      },
+      "afterGradePoint": 100,
+      "gradePointDiff": "KEEP",
+      "bossResult": null,
+      "myResult": {
+        "deliverCount": 999,
+        "goldenDeliverCount": 88
+      },
+      "memberResults": [
+        {
+          "deliverCount": 0,
+          "goldenDeliverCount": 0
+        },
+        {
+          "deliverCount": 0,
+          "goldenDeliverCount": 0
+        },
+        {
+          "deliverCount": 0,
+          "goldenDeliverCount": 0
+        }
+      ]
+    },
+    "groupInfo": {
+      "startTime": "2022-12-12T00:00:00Z",
+      "endTime": "2022-12-13T16:00:00Z",
+      "mode": "REGULAR",
+      "rule": "REGULAR",
+      "highestResult": {
+        "grade": {
+          "name": "Eggsecutive VP"
+        },
+        "gradePoint": 150,
+        "jobScore": 120
+      }
+    },
+    "detail": {
+      "__typename": "CoopHistoryDetail",
+      "afterGrade": {
+        "name": "Eggsecutive VP"
+      },
+      "myResult": {
+        "player": {
+          "__isPlayer": "CoopPlayer",
+          "byname": "The Usual Off the Hook Fan",
+          "name": "Pearl",
+          "nameId": "0000",
+          "nameplate": {
+            "badges": [
+              null,
+              null,
+              null
+            ],
+            "background": {
+              "textColor": {
+                "a": 1,
+                "b": 1,
+                "g": 1,
+                "r": 1
+              },
+              "image": {
+                "url": {
+                  "pathname": "#"
+                }
+              }
+            }
+          },
+          "uniform": {
+            "name": "Pink Slopsuit",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          },
+          "species": "INKLING"
+        },
+        "weapons": [
+          {
+            "name": "Splat Dualies",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          },
+          {
+            "name": "Dark Tetra Dualies",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          },
+          {
+            "name": "Dapple Dualies",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          }
+        ],
+        "specialWeapon": {
+          "name": "Booyah Bomb",
+          "image": {
+            "url": {
+              "pathname": "#"
+            }
+          },
+          "weaponId": 20006
+        },
+        "defeatEnemyCount": 16,
+        "deliverCount": 777,
+        "goldenAssistCount": 0,
+        "goldenDeliverCount": 22,
+        "rescueCount": 3,
+        "rescuedCount": 2
+      },
+      "memberResults": [
+        {
+          "player": {
+            "__isPlayer": "CoopPlayer",
+            "byname": "",
+            "name": "Player",
+            "nameId": "0000",
+            "nameplate": {
+              "badges": [
+                null,
+                null,
+                null
+              ],
+              "background": {
+                "textColor": {
+                  "a": 1,
+                  "b": 1,
+                  "g": 1,
+                  "r": 1
+                },
+                "image": {
+                  "url": {
+                    "pathname": "#"
+                  }
+                }
+              }
+            },
+            "uniform": {
+              "name": "Orange Slopsuit",
+              "image": {
+                "url": {
+                  "pathname": "#"
+                }
+              }
+            },
+            "species": "INKLING"
+          },
+          "weapons": [
+            {
+              "name": "Jet Squelcher",
+              "image": {
+                "url": {
+                  "pathname": "#"
+                }
+              }
+            },
+            {
+              "name": "Explosher",
+              "image": {
+                "url": {
+                  "pathname": "#"
+                }
+              }
+            },
+            {
+              "name": "Dark Tetra Dualies",
+              "image": {
+                "url": {
+                  "pathname": "#"
+                }
+              }
+            }
+          ],
+          "specialWeapon": {
+            "name": "Unknown",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          },
+          "defeatEnemyCount": 0,
+          "deliverCount": 0,
+          "goldenAssistCount": 0,
+          "goldenDeliverCount": 0,
+          "rescueCount": 0,
+          "rescuedCount": 0
+        }
+      ],
+      "bossResult": null,
+      "enemyResults": [
+        {
+          "defeatCount": 1,
+          "teamDefeatCount": 1,
+          "popCount": 1,
+          "enemy": {
+            "name": "Flyfish",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          }
+        },
+        {
+          "defeatCount": 2,
+          "teamDefeatCount": 0,
+          "popCount": 2,
+          "enemy": {
+            "name": "Scrapper",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          }
+        },
+        {
+          "defeatCount": 1,
+          "teamDefeatCount": 0,
+          "popCount": 1,
+          "enemy": {
+            "name": "Steel Eel",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          }
+        },
+        {
+          "defeatCount": 1,
+          "teamDefeatCount": 0,
+          "popCount": 1,
+          "enemy": {
+            "name": "Stinger",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          }
+        },
+        {
+          "defeatCount": 3,
+          "teamDefeatCount": 0,
+          "popCount": 3,
+          "enemy": {
+            "name": "Drizzler",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          }
+        },
+        {
+          "defeatCount": 2,
+          "teamDefeatCount": 1,
+          "popCount": 2,
+          "enemy": {
+            "name": "Slammin' Lid",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          }
+        },
+        {
+          "defeatCount": 6,
+          "teamDefeatCount": 8,
+          "popCount": 6,
+          "enemy": {
+            "name": "Mudmouth",
+            "image": {
+              "url": {
+                "pathname": "#"
+              }
+            }
+          }
+        }
+      ],
+      "waveResults": [
+        {
+          "waveNumber": 1,
+          "waterLevel": 1,
+          "eventWave": {
+            "name": "Mudmouth Eruptions"
+          },
+          "deliverNorm": 21,
+          "goldenPopCount": 63,
+          "teamDeliverCount": 54,
+          "specialWeapons": []
+        },
+        {
+          "waveNumber": 2,
+          "waterLevel": 1,
+          "eventWave": {
+            "name": "The Mothership"
+          },
+          "deliverNorm": 22,
+          "goldenPopCount": 30,
+          "teamDeliverCount": 26,
+          "specialWeapons": [
+            {
+              "name": "Inkjet",
+              "image": {
+                "url": {
+                  "pathname": "#"
+                }
+              }
+            },
+            {
+              "name": "Inkjet",
+              "image": {
+                "url": {
+                  "pathname": "#"
+                }
+              }
+            },
+            {
+              "name": "Crab Tank",
+              "image": {
+                "url": {
+                  "pathname": "#"
+                }
+              }
+            }
+          ]
+        },
+        {
+          "waveNumber": 3,
+          "waterLevel": 0,
+          "eventWave": null,
+          "deliverNorm": 24,
+          "goldenPopCount": 28,
+          "teamDeliverCount": 17,
+          "specialWeapons": []
+        }
+      ],
+      "resultWave": 3,
+      "playedTime": "2022-12-12T00:00:00Z",
+      "rule": "REGULAR",
+      "coopStage": {
+        "name": "Marooner's Bay",
+        "image": {
+          "url": {
+            "pathname": "#"
+          }
+        }
+      },
+      "dangerRate": 2.22,
+      "scenarioCode": null,
+      "smellMeter": 0,
+      "weapons": [
+        {
+          "name": "Random",
+          "image": {
+            "url": {
+              "pathname": "#"
+            }
+          }
+        },
+        {
+          "name": "Random",
+          "image": {
+            "url": {
+              "pathname": "#"
+            }
+          }
+        },
+        {
+          "name": "Random",
+          "image": {
+            "url": {
+              "pathname": "#"
+            }
+          }
+        },
+        {
+          "name": "Random",
+          "image": {
+            "url": {
+              "pathname": "#"
+            }
+          }
+        }
+      ],
+      "afterGradePoint": 100,
+      "scale": null,
+      "jobPoint": 0,
+      "jobScore": 0,
+      "jobRate": 1,
+      "jobBonus": 0,
+      "nextHistoryDetail": {},
+      "previousHistoryDetail": {}
+    }
+  }
+}
\ No newline at end of file
diff --git a/source/plugins/community/splatoon/s3si/mocks/u_summary.json b/source/plugins/community/splatoon/s3si/mocks/u_summary.json
new file mode 100644
index 00000000000..679df98bddf
--- /dev/null
+++ b/source/plugins/community/splatoon/s3si/mocks/u_summary.json
@@ -0,0 +1,352 @@
+{
+  "type": "SUMMARY",
+  "exportTime": "2023-01-19T00:00:00.000Z",
+  "data": {
+    "ConfigureAnalyticsQuery": {
+      "playHistory": {
+        "udemaeMax": "S+0",
+        "paintPointTotal": 999999,
+        "gameStartTime": "2022-09-09T00:00:00Z",
+        "battleNumTotal": 333,
+        "xMatchMaxAr": {
+          "rank": null
+        },
+        "xMatchMaxCl": {
+          "rank": null
+        },
+        "xMatchMaxGl": {
+          "rank": null
+        },
+        "xMatchMaxLf": {
+          "rank": null
+        }
+      }
+    },
+    "HistoryRecordQuery": {
+      "currentPlayer": {
+        "__isPlayer": "CurrentPlayer",
+        "byname": "The Usual Off the Hook Fan",
+        "name": "Pearl",
+        "nameId": "0000",
+        "nameplate": {
+          "badges": [
+            null,
+            null,
+            {
+              "image": {
+                "url": "https://cdn.wikimg.net/en/splatoonwiki/images/d/d4/S3_Banner_11076.png"
+              }
+            }
+          ],
+          "background": {
+            "textColor": {
+              "a": 1,
+              "b": 1,
+              "g": 1,
+              "r": 1
+            },
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/6/6a/S3_Banner_901.png"
+            }
+          }
+        },
+        "weapon": {
+          "name": "Splat Dualies",
+          "image": {
+            "url": "https://cdn.wikimg.net/en/splatoonwiki/images/e/ec/S3_Weapon_Main_Splat_Dualies_Flat.png"
+          },
+          "subWeapon": {
+            "name": "Suction Bomb",
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/f/f2/S3_Weapon_Sub_Suction_Bomb_Flat.png/24px-S3_Weapon_Sub_Suction_Bomb_Flat.png"
+            }
+          },
+          "specialWeapon": {
+            "name": "Crab Tank",
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/8/88/S3_Weapon_Special_Crab_Tank.png"
+            }
+          }
+        },
+        "headGear": {
+          "__isGear": "HeadGear",
+          "name": "Pearlescent Crown",
+          "image": {
+            "url": "https://cdn.wikimg.net/en/splatoonwiki/images/3/3c/S3_Gear_Headgear_Pearlescent_Crown_S.png"
+          },
+          "primaryGearPower": {
+            "name": "Last-Ditch Effort",
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/c/c7/S3_Ability_Last-Ditch_Effort.png"
+            }
+          },
+          "additionalGearPowers": [
+            {
+              "name": "Quick Respawn",
+              "image": {
+                "url": "https://cdn.wikimg.net/en/splatoonwiki/images/9/98/S3_Ability_Quick_Respawn.png"
+              }
+            },
+            {
+              "name": "Quick Respawn",
+              "image": {
+                "url": "https://cdn.wikimg.net/en/splatoonwiki/images/9/98/S3_Ability_Quick_Respawn.png"
+              }
+            },
+            {
+              "name": "Quick Respawn",
+              "image": {
+                "url": "https://cdn.wikimg.net/en/splatoonwiki/images/9/98/S3_Ability_Quick_Respawn.png"
+              }
+            }
+          ]
+        },
+        "clothingGear": {
+          "__isGear": "ClothingGear",
+          "name": "Pearlescent Hoodie",
+          "image": {
+            "url": "https://cdn.wikimg.net/en/splatoonwiki/images/4/42/S3_Gear_Clothing_Pearlescent_Hoodie.png"
+          },
+          "primaryGearPower": {
+            "name": "Respawn Punisher",
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/6/68/S3_Ability_Respawn_Punisher.png"
+            }
+          },
+          "additionalGearPowers": [
+            {
+              "name": "Quick Respawn",
+              "image": {
+                "url": "https://cdn.wikimg.net/en/splatoonwiki/images/9/98/S3_Ability_Quick_Respawn.png"
+              }
+            },
+            {
+              "name": "Quick Respawn",
+              "image": {
+                "url": "https://cdn.wikimg.net/en/splatoonwiki/images/9/98/S3_Ability_Quick_Respawn.png"
+              }
+            },
+            {
+              "name": "Quick Respawn",
+              "image": {
+                "url": "https://cdn.wikimg.net/en/splatoonwiki/images/9/98/S3_Ability_Quick_Respawn.png"
+              }
+            }
+          ]
+        },
+        "shoesGear": {
+          "__isGear": "ShoesGear",
+          "name": "Pearlescent Kicks",
+          "image": {
+            "url": "https://cdn.wikimg.net/en/splatoonwiki/images/6/64/S3_Gear_Shoes_Pearlescent_Kicks.png"
+          },
+          "primaryGearPower": {
+            "name": "Stealth Jump",
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/5/5a/S3_Ability_Stealth_Jump.png"
+            }
+          },
+          "additionalGearPowers": [
+            {
+              "name": "Quick Super Jump",
+              "image": {
+                "url": "https://cdn.wikimg.net/en/splatoonwiki/images/d/d5/S3_Ability_Quick_Super_Jump.png"
+              }
+            },
+            {
+              "name": "Ink Resistance Up",
+              "image": {
+                "url": "https://cdn.wikimg.net/en/splatoonwiki/images/6/6d/S3_Ability_Ink_Resistance_Up.png"
+              }
+            },
+            {
+              "name": "Sub Resistance Up",
+              "image": {
+                "url": "https://cdn.wikimg.net/en/splatoonwiki/images/d/d4/S3_Ability_Sub_Resistance_Up.png"
+              }
+            }
+          ]
+        },
+        "userIcon": {
+          "url": "https://cdn-image-e0d67c509fb203858ebcb2fe3f88c2aa.baas.nintendo.com/1/3d2fd3bbdd21df80"
+        }
+      },
+      "playHistory": {
+        "currentTime": "2023-01-01T00:00:00Z",
+        "gameStartTime": "2022-09-09T00:00:00Z",
+        "rank": 50,
+        "udemae": "S+0",
+        "xMatchRankAr": null,
+        "xMatchRankCl": null,
+        "xMatchRankGl": null,
+        "xMatchRankLf": null,
+        "udemaeMax": "S+0",
+        "xMatchMaxAr": {
+          "power": null,
+          "rank": null,
+          "rankUpdateSeasonName": null,
+          "powerUpdateTime": null
+        },
+        "xMatchMaxCl": {
+          "power": null,
+          "rank": null,
+          "rankUpdateSeasonName": null,
+          "powerUpdateTime": null
+        },
+        "xMatchMaxGl": {
+          "power": null,
+          "rank": null,
+          "rankUpdateSeasonName": null,
+          "powerUpdateTime": null
+        },
+        "xMatchMaxLf": {
+          "power": null,
+          "rank": null,
+          "rankUpdateSeasonName": null,
+          "powerUpdateTime": null
+        },
+        "winCountTotal": 333,
+        "frequentlyUsedWeapons": [
+          {
+            "name": "Splat Dualies",
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/e/ec/S3_Weapon_Main_Splat_Dualies_Flat.png"
+            }
+          }
+        ],
+        "paintPointTotal": 999999,
+        "badges": [],
+        "weaponHistory": {
+          "nodes": [
+            {
+              "seasonName": "Chill Season 2022",
+              "isMonthly": true,
+              "startTime": "2022-12-01T00:00:00Z",
+              "endTime": "2022-12-12T01:18:48Z",
+              "weaponCategories": [
+                {
+                  "weaponCategory": {
+                    "name": "Dualies",
+                    "category": "Maneuver"
+                  },
+                  "utilRatio": 1,
+                  "weapons": [
+                    {
+                      "weapon": {
+                        "name": "Splat Dualies",
+                        "image": {
+                          "url": "https://cdn.wikimg.net/en/splatoonwiki/images/e/ec/S3_Weapon_Main_Splat_Dualies_Flat.png"
+                        },
+                        "weaponCategory": {
+                          "category": "Maneuver"
+                        }
+                      },
+                      "utilRatio": 0.846
+                    },
+                    {
+                      "weapon": {
+                        "name": "Dark Tetra Dualies",
+                        "image": {
+                          "url": "https://cdn.wikimg.net/en/splatoonwiki/images/2/2a/S3_Weapon_Main_Dark_Tetra_Dualies_Flat.png"
+                        },
+                        "weaponCategory": {
+                          "category": "Maneuver"
+                        }
+                      },
+                      "utilRatio": 0.154
+                    }
+                  ]
+                }
+              ],
+              "weapons": [
+                {
+                  "weapon": {
+                    "name": "Splat Dualies",
+                    "image": {
+                      "url": "https://cdn.wikimg.net/en/splatoonwiki/images/e/ec/S3_Weapon_Main_Splat_Dualies_Flat.png"
+                    }
+                  },
+                  "utilRatio": 0.846
+                },
+                {
+                  "weapon": {
+                    "name": "Dark Tetra Dualies",
+                    "image": {
+                      "url": "https://cdn.wikimg.net/en/splatoonwiki/images/2/2a/S3_Weapon_Main_Dark_Tetra_Dualies_Flat.png"
+                    }
+                  },
+                  "utilRatio": 0.154
+                }
+              ]
+            }
+          ]
+        },
+        "recentBadges": [
+          {
+            "id": "QmFkZ2UtNTEwMDAwMQ==",
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/2/20/S3_Badge_Grizzco_100K.png"
+            },
+            "description": "100,000 Grizzco Point Club"
+          }
+        ],
+        "allBadges": [
+          {
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/4/4a/S3_Badge_Splat_Dualies_5.png"
+            },
+            "description": "5★ Splat Dualies User"
+          },
+          {
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/4/47/S3_Badge_Rank_S%2B.png"
+            },
+            "description": "S+ Rank Reached!"
+          },
+          {
+            "image": {
+              "url": "https://cdn.wikimg.net/en/splatoonwiki/images/2/20/S3_Badge_Grizzco_100K.png"
+            },
+            "description": "100,000 Grizzco Point Club"
+          }
+        ]
+      }
+    },
+    "CoopHistoryQuery": {
+      "coopResult": {
+        "historyGroupsOnlyFirst": {
+          "nodes": []
+        },
+        "regularAverageClearWave": 2,
+        "regularGrade": {
+          "name": "Eggsecutive VP"
+        },
+        "regularGradePoint": 100,
+        "monthlyGear": {
+          "__typename": "HeadGear",
+          "name": "Bream-Brim Cap",
+          "image": {
+            "url": "https://cdn.wikimg.net/en/splatoonwiki/images/6/6d/S3_Gear_Headgear_Bream-Brim_Cap.png"
+          }
+        },
+        "scale": {
+          "gold": 0,
+          "silver": 0,
+          "bronze": 0
+        },
+        "pointCard": {
+          "defeatBossCount": 199,
+          "deliverCount": 1234567,
+          "goldenDeliverCount": 34567,
+          "playCount": 444,
+          "rescueCount": 1234,
+          "regularPoint": 0,
+          "totalPoint": 100000
+        },
+        "historyGroups": {
+          "nodes": []
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/source/plugins/community/splatoon/s3si/mocks/u_vs.json b/source/plugins/community/splatoon/s3si/mocks/u_vs.json
new file mode 100644
index 00000000000..8ce4cf2a610
--- /dev/null
+++ b/source/plugins/community/splatoon/s3si/mocks/u_vs.json
@@ -0,0 +1,576 @@
+{
+  "type": "VS",
+  "exportTime": "2023-01-19T00:00:00.000Z",
+  "data": {
+    "type": "VsInfo",
+    "bankaraMatchChallenge": {
+      "winCount": 3,
+      "loseCount": 0,
+      "maxWinCount": 5,
+      "maxLoseCount": 3,
+      "state": "INPROGRESS",
+      "isPromo": false,
+      "isUdemaeUp": null,
+      "udemaeAfter": null,
+      "earnedUdemaePoint": null
+    },
+    "listNode": {
+      "vsMode": {
+        "mode": "BANKARA"
+      },
+      "vsRule": {
+        "name": "Splat Zones"
+      },
+      "vsStage": {
+        "name": "Inkblot Art Academy",
+        "image": {}
+      },
+      "judgement": "WIN",
+      "player": {
+        "weapon": {
+          "name": "Splat Dualies",
+          "image": {}
+        }
+      },
+      "knockout": "WIN",
+      "myTeam": {
+        "result": {
+          "paintPoint": null,
+          "paintRatio": null,
+          "score": 100
+        }
+      },
+      "udemae": "S+0",
+      "bankaraMatch": {
+        "earnedUdemaePoint": null
+      },
+      "nextHistoryDetail": null,
+      "previousHistoryDetail": {}
+    },
+    "challengeProgress": {
+      "index": 0,
+      "winCount": 3,
+      "loseCount": 0
+    },
+    "rankState": null,
+    "rankBeforeState": null,
+    "detail": {
+      "__typename": "VsHistoryDetail",
+      "vsRule": {
+        "name": "Splat Zones",
+        "rule": "AREA"
+      },
+      "vsMode": {
+        "mode": "BANKARA"
+      },
+      "player": {
+        "__isPlayer": "VsPlayer",
+        "byname": "The Usual Off the Hook Fan",
+        "name": "Pearl",
+        "nameId": "0000",
+        "nameplate": {
+          "badges": [
+            null,
+            null,
+            null
+          ],
+          "background": {
+            "textColor": {
+              "a": 1,
+              "b": 1,
+              "g": 1,
+              "r": 1
+            },
+            "image": {}
+          }
+        },
+        "headGear": {
+          "name": "Pearlescent Crown",
+          "image": {},
+          "__isGear": "HeadGear",
+          "primaryGearPower": {
+            "name": "Last-Ditch Effort",
+            "image": {}
+          },
+          "additionalGearPowers": [
+            {
+              "name": "Quick Respawn",
+              "image": {}
+            },
+            {
+              "name": "Quick Respawn",
+              "image": {}
+            },
+            {
+              "name": "Quick Respawn",
+              "image": {}
+            }
+          ],
+          "originalImage": {},
+          "brand": {
+            "name": "amiibo",
+            "image": {},
+            "usualGearPower": {
+              "name": "Unknown",
+              "desc": "Unlock this ability by battling while wearing this gear.",
+              "image": {},
+              "isEmptySlot": true
+            }
+          }
+        },
+        "clothingGear": {
+          "name": "Pearlescent Hoodie",
+          "image": {},
+          "__isGear": "ClothingGear",
+          "primaryGearPower": {
+            "name": "Respawn Punisher",
+            "image": {}
+          },
+          "additionalGearPowers": [
+            {
+              "name": "Quick Respawn",
+              "image": {}
+            },
+            {
+              "name": "Quick Respawn",
+              "image": {}
+            },
+            {
+              "name": "Quick Respawn",
+              "image": {}
+            }
+          ],
+          "originalImage": {},
+          "brand": {
+            "name": "amiibo",
+            "image": {},
+            "usualGearPower": {
+              "name": "Unknown",
+              "desc": "Unlock this ability by battling while wearing this gear.",
+              "image": {},
+              "isEmptySlot": true
+            }
+          }
+        },
+        "shoesGear": {
+          "name": "Pearlescent Kicks",
+          "image": {},
+          "__isGear": "ShoesGear",
+          "primaryGearPower": {
+            "name": "Stealth Jump",
+            "image": {}
+          },
+          "additionalGearPowers": [
+            {
+              "name": "Quick Super Jump",
+              "image": {}
+            },
+            {
+              "name": "Ink Resistance Up",
+              "image": {}
+            },
+            {
+              "name": "Sub Resistance Up",
+              "image": {}
+            }
+          ],
+          "originalImage": {},
+          "brand": {
+            "name": "amiibo",
+            "image": {},
+            "usualGearPower": {
+              "name": "Unknown",
+              "desc": "Unlock this ability by battling while wearing this gear.",
+              "image": {},
+              "isEmptySlot": true
+            }
+          }
+        },
+        "paint": 888
+      },
+      "judgement": "WIN",
+      "myTeam": {
+        "color": {
+          "a": 1,
+          "b": 0.454901993,
+          "g": 0.176470593,
+          "r": 0.756862819
+        },
+        "judgement": "WIN",
+        "result": {
+          "paintRatio": null,
+          "score": 100,
+          "noroshi": null
+        },
+        "tricolorRole": null,
+        "festTeamName": null,
+        "players": [
+          {
+            "nameId": "0000",
+            "name": "Pearl",
+            "isMyself": true,
+            "byname": "The Usual Off the Hook Fan",
+            "weapon": {
+              "name": "Splat Dualies",
+              "image": {},
+              "specialWeapon": {
+                "maskingImage": {
+                  "width": 100,
+                  "height": 100
+                },
+                "name": "Crab Tank",
+                "image": {}
+              },
+              "image3d": {},
+              "image2d": {},
+              "image3dThumbnail": {},
+              "image2dThumbnail": {},
+              "subWeapon": {
+                "name": "Suction Bomb",
+                "image": {}
+              }
+            },
+            "species": "INKLING",
+            "__isPlayer": "VsPlayer",
+            "nameplate": {
+              "badges": [
+                null,
+                null,
+                null
+              ],
+              "background": {
+                "textColor": {
+                  "a": 1,
+                  "b": 1,
+                  "g": 1,
+                  "r": 1
+                },
+                "image": {}
+              }
+            },
+            "headGear": {
+              "name": "Pearlescent Crown",
+              "image": {},
+              "__isGear": "HeadGear",
+              "primaryGearPower": {
+                "name": "Last-Ditch Effort",
+                "image": {}
+              },
+              "additionalGearPowers": [
+                {
+                  "name": "Quick Respawn",
+                  "image": {}
+                },
+                {
+                  "name": "Quick Respawn",
+                  "image": {}
+                },
+                {
+                  "name": "Quick Respawn",
+                  "image": {}
+                }
+              ],
+              "originalImage": {},
+              "brand": {
+                "name": "amiibo",
+                "image": {},
+                "usualGearPower": {
+                  "name": "Unknown",
+                  "desc": "Unlock this ability by battling while wearing this gear.",
+                  "image": {},
+                  "isEmptySlot": true
+                }
+              }
+            },
+            "clothingGear": {
+              "name": "Pearlescent Hoodie",
+              "image": {},
+              "__isGear": "ClothingGear",
+              "primaryGearPower": {
+                "name": "Respawn Punisher",
+                "image": {}
+              },
+              "additionalGearPowers": [
+                {
+                  "name": "Quick Respawn",
+                  "image": {}
+                },
+                {
+                  "name": "Quick Respawn",
+                  "image": {}
+                },
+                {
+                  "name": "Quick Respawn",
+                  "image": {}
+                }
+              ],
+              "originalImage": {},
+              "brand": {
+                "name": "amiibo",
+                "image": {},
+                "usualGearPower": {
+                  "name": "Unknown",
+                  "desc": "Unlock this ability by battling while wearing this gear.",
+                  "image": {},
+                  "isEmptySlot": true
+                }
+              }
+            },
+            "shoesGear": {
+              "name": "Pearlescent Kicks",
+              "image": {},
+              "__isGear": "ShoesGear",
+              "primaryGearPower": {
+                "name": "Stealth Jump",
+                "image": {}
+              },
+              "additionalGearPowers": [
+                {
+                  "name": "Quick Super Jump",
+                  "image": {}
+                },
+                {
+                  "name": "Ink Resistance Up",
+                  "image": {}
+                },
+                {
+                  "name": "Sub Resistance Up",
+                  "image": {}
+                }
+              ],
+              "originalImage": {},
+              "brand": {
+                "name": "amiibo",
+                "image": {},
+                "usualGearPower": {
+                  "name": "Unknown",
+                  "desc": "Unlock this ability by battling while wearing this gear.",
+                  "image": {},
+                  "isEmptySlot": true
+                }
+              }
+            },
+            "paint": 888,
+            "result": {
+              "kill": 8,
+              "death": 3,
+              "assist": 4,
+              "special": 1,
+              "noroshiTry": null
+            },
+            "festDragonCert": "NONE",
+            "__typename": "VsPlayer"
+          }
+        ],
+        "order": 1
+      },
+      "vsStage": {
+        "name": "Inkblot Art Academy",
+        "image": {}
+      },
+      "festMatch": null,
+      "knockout": "WIN",
+      "otherTeams": [
+        {
+          "judgement": "LOSE",
+          "color": {
+            "a": 1,
+            "b": 0.133333296,
+            "g": 0.721568584,
+            "r": 0.172549993
+          },
+          "result": {
+            "paintRatio": null,
+            "score": 0,
+            "noroshi": null
+          },
+          "tricolorRole": null,
+          "players": [
+            {
+              "nameId": "0000",
+              "name": "Marina",
+              "isMyself": false,
+              "byname": "",
+              "weapon": {
+                "name": "Splattershot",
+                "image": {},
+                "specialWeapon": {
+                  "maskingImage": {
+                    "width": 100,
+                    "height": 100
+                  },
+                  "name": "Trizooka",
+                  "image": {}
+                },
+                "image3d": {},
+                "image2d": {},
+                "image3dThumbnail": {},
+                "image2dThumbnail": {},
+                "subWeapon": {
+                  "name": "Suction Bomb",
+                  "image": {}
+                }
+              },
+              "species": "OCTOLING",
+              "__isPlayer": "VsPlayer",
+              "nameplate": {
+                "badges": [
+                  null,
+                  null,
+                  null
+                ],
+                "background": {
+                  "textColor": {
+                    "a": 1,
+                    "b": 1,
+                    "g": 1,
+                    "r": 1
+                  },
+                  "image": {}
+                }
+              },
+              "headGear": {
+                "name": "Unknown",
+                "thumbnailImage": {},
+                "__isGear": "HeadGear",
+                "primaryGearPower": {
+                  "name": "Unknown",
+                  "image": {}
+                },
+                "additionalGearPowers": [
+                  {
+                    "name": "Unknown",
+                    "image": {}
+                  },
+                  {
+                    "name": "Unknown",
+                    "image": {}
+                  },
+                  {
+                    "name": "Unknown",
+                    "image": {}
+                  }
+                ],
+                "originalImage": {},
+                "brand": {
+                  "name": "amiibo",
+                  "image": {},
+                  "usualGearPower": {
+                    "name": "Unknown",
+                    "desc": "Unlock this ability by battling while wearing this gear.",
+                    "image": {},
+                    "isEmptySlot": true
+                  }
+                }
+              },
+              "clothingGear": {
+                "name": "Unknown",
+                "thumbnailImage": {},
+                "__isGear": "ClothingGear",
+                "primaryGearPower": {
+                  "name": "Unknown",
+                  "image": {}
+                },
+                "additionalGearPowers": [
+                  {
+                    "name": "Unknown",
+                    "image": {}
+                  },
+                  {
+                    "name": "Unknown",
+                    "image": {}
+                  },
+                  {
+                    "name": "Unknown",
+                    "image": {}
+                  }
+                ],
+                "originalImage": {},
+                "brand": {
+                  "name": "amiibo",
+                  "image": {},
+                  "usualGearPower": {
+                    "name": "Unknown",
+                    "desc": "Unlock this ability by battling while wearing this gear.",
+                    "image": {},
+                    "isEmptySlot": true
+                  }
+                }
+              },
+              "shoesGear": {
+                "name": "Unknown",
+                "thumbnailImage": {},
+                "__isGear": "ShoesGear",
+                "primaryGearPower": {
+                  "name": "Unknown",
+                  "image": {}
+                },
+                "additionalGearPowers": [
+                  {
+                    "name": "Unknown",
+                    "image": {}
+                  },
+                  {
+                    "name": "Unknown",
+                    "image": {}
+                  },
+                  {
+                    "name": "Unknown",
+                    "image": {}
+                  }
+                ],
+                "originalImage": {},
+                "brand": {
+                  "name": "amiibo",
+                  "image": {},
+                  "usualGearPower": {
+                    "name": "Unknown",
+                    "desc": "Unlock this ability by battling while wearing this gear.",
+                    "image": {},
+                    "isEmptySlot": true
+                  }
+                }
+              },
+              "paint": 0,
+              "result": {
+                "kill": 0,
+                "death": 0,
+                "assist": 0,
+                "special": 0,
+                "noroshiTry": null
+              },
+              "festDragonCert": "NONE",
+              "__typename": "VsPlayer"
+            }
+          ],
+          "order": 2,
+          "festTeamName": null
+        }
+      ],
+      "bankaraMatch": {
+        "earnedUdemaePoint": null,
+        "mode": "CHALLENGE"
+      },
+      "xMatch": null,
+      "duration": 69,
+      "playedTime": "2023-01-19T00:00:00.000Z",
+      "awards": [
+        {
+          "name": "#1 Popular Target",
+          "rank": "GOLD"
+        },
+        {
+          "name": "#1 Score Booster",
+          "rank": "GOLD"
+        },
+        {
+          "name": "#1 Damage Taker",
+          "rank": "SILVER"
+        }
+      ],
+      "leagueMatch": null,
+      "nextHistoryDetail": null,
+      "previousHistoryDetail": {}
+    }
+  }
+}
\ No newline at end of file
diff --git a/source/templates/classic/partials/splatoon.ejs b/source/templates/classic/partials/splatoon.ejs
index f75e37575de..053508e4ba2 100644
--- a/source/templates/classic/partials/splatoon.ejs
+++ b/source/templates/classic/partials/splatoon.ejs
@@ -266,6 +266,7 @@
     }
     .match:not(:last-child) {
       border-bottom: 2px dashed rgba(0, 0, 0, .4);
+      padding-bottom: 4px;
     }
     .match-details {
       flex-grow: 1;

From f53d0751e02c12883b39c339e97f66e06018b40f Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 19 Jan 2023 00:10:22 -0500
Subject: [PATCH 073/196] fix: lint

---
 source/plugins/community/splatoon/index.mjs | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/source/plugins/community/splatoon/index.mjs b/source/plugins/community/splatoon/index.mjs
index 95cc5bdcb26..144edcfa129 100644
--- a/source/plugins/community/splatoon/index.mjs
+++ b/source/plugins/community/splatoon/index.mjs
@@ -55,8 +55,8 @@ export default async function({login, q, imports, data, account}, {enabled = fal
 
     //Read fetched data
     const exported = await Promise.all(
-      (await imports.fs.readdir(`${imports.__module(import.meta.url)}/s3si/${source == "mocks" ? "mocks" : "export"}`))
-        .map(async file => JSON.parse(await imports.fs.readFile(`${imports.__module(import.meta.url)}/s3si/${source == "mocks" ? "mocks" : "export"}/${file}`))),
+      (await imports.fs.readdir(`${imports.__module(import.meta.url)}/s3si/${source === "mocks" ? "mocks" : "export"}`))
+        .map(async file => JSON.parse(await imports.fs.readFile(`${imports.__module(import.meta.url)}/s3si/${source === "mocks" ? "mocks" : "export"}/${file}`))),
     )
     const summary = exported.filter(({type}) => type === "SUMMARY").at(0)
     if (!summary)

From ec503932d446d3bafa9a21eee927494becc7bc47 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 19 Jan 2023 05:53:57 +0000
Subject: [PATCH 074/196] ci: auto-regenerate files

---
 README.md                                   | 2 ++
 source/plugins/community/splatoon/README.md | 7 ++++---
 source/plugins/sponsorships/README.md       | 9 +++------
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/README.md b/README.md
index fb07193cb34..74b6e71c501 100644
--- a/README.md
+++ b/README.md
@@ -432,6 +432,8 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
 # 📚 Documentation
 
 
+> <sup>*⚠️ This is the documentation of **v3.33-beta** (`@master`/`@main` branches) which includes [unreleased features](https://github.com/lowlighter/metrics/compare/latest...master) planned for next release. See documentation for current released version [**v3.32** (`@latest` branch) here](https://github.com/lowlighter/metrics/blob/latest/README.md).* </sup>
+
 
 
 ## 🦮 Setup
diff --git a/source/plugins/community/splatoon/README.md b/source/plugins/community/splatoon/README.md
index 4fe9365c3e8..99e2efaccd8 100644
--- a/source/plugins/community/splatoon/README.md
+++ b/source/plugins/community/splatoon/README.md
@@ -134,6 +134,7 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
 <ul>
 <li><code>splatnet</code> will fetch data from Splatnet using <a href="https://github.com/spacemeowx2/s3si.ts">spacemeowx2/s3si.ts</a> tool</li>
 <li><code>local</code> will assume <code>s3si/export</code> directory already exists and is populated (use this when developping new features for this plugin to save network resources and time)</li>
+<li><code>mocks</code> will use <code>s3si/mocks</code> directory (use this when developping new features for this plugin to avoid setting up a NSO token)</li>
 </ul>
 <img width="900" height="1" alt=""></td>
   </tr>
@@ -143,7 +144,7 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> splatnet<br>
-<b>allowed values:</b><ul><li>splatnet</li><li>local</li></ul></td>
+<b>allowed values:</b><ul><li>splatnet</li><li>local</li><li>mocks</li></ul></td>
   </tr>
 </table>
 <!--/options-->
@@ -186,7 +187,7 @@ name: Splatnet data
 uses: lowlighter/metrics@latest
 with:
   filename: metrics.plugin.splatoon.svg
-  token: ${{ secrets.METRICS_TOKEN }}
+  token: NOT_NEEDED
   base: ""
   plugin_splatoon: yes
   plugin_splatoon_token: ${{ secrets.SPLATOON_TOKEN }}
@@ -197,7 +198,7 @@ name: Splatnet data with stat.ink integration
 uses: lowlighter/metrics@latest
 with:
   filename: metrics.plugin.splatoon.svg
-  token: ${{ secrets.METRICS_TOKEN }}
+  token: NOT_NEEDED
   base: ""
   plugin_splatoon: yes
   plugin_splatoon_token: ${{ secrets.SPLATOON_TOKEN }}
diff --git a/source/plugins/sponsorships/README.md b/source/plugins/sponsorships/README.md
index d23645a7149..068b30b388f 100644
--- a/source/plugins/sponsorships/README.md
+++ b/source/plugins/sponsorships/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -54,8 +53,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> amount, sponsorships<br>
@@ -67,8 +65,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(8 ≤
 𝑥
 ≤ 64)</i>

From ba5d3c4931bd522e82a17691ff96eca8578a80b5 Mon Sep 17 00:00:00 2001
From: lowlighter <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 23 Jan 2023 18:12:34 -0500
Subject: [PATCH 075/196] fix(app/metrics/utils): support base64 svg [skip ci]

---
 source/app/metrics/utils.mjs | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index ea06ddc77fd..74aa0441a10 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -451,6 +451,9 @@ export async function imgb64(image, {width, height, fallback = true} = {}) {
   //Undefined image
   if (!image)
     return fallback ? "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==" : null
+  //SVG image
+  if ((typeof image === "string") && (image.endsWith(".svg")))
+    return `data:image/svg+xml;base64,${Buffer.from(await fetch(image).then(response => response.arrayBuffer())).toString("base64")}`
   //Load image
   let ext = "png"
   try {

From bfefe35b857dd09a2e7bab2ec61f8f2371257977 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 12 Mar 2023 22:41:40 -0400
Subject: [PATCH 076/196] chore(deps): bump eslint from 8.32.0 to 8.35.0
 (#1387) [skip ci]

---
 package-lock.json | 75 +++++++++++++++++++++++++++++------------------
 package.json      |  2 +-
 2 files changed, 47 insertions(+), 30 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3119bc8c1b5..24b55e9270e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,7 +50,7 @@
         "xml-formatter": "^3.2.0"
       },
       "devDependencies": {
-        "eslint": "^8.32.0",
+        "eslint": "^8.35.0",
         "jest": "^29.3.1",
         "libxmljs2": "^0.31.0"
       },
@@ -742,9 +742,9 @@
       "dev": true
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
-      "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz",
+      "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
@@ -809,6 +809,15 @@
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
       "dev": true
     },
+    "node_modules/@eslint/js": {
+      "version": "8.35.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz",
+      "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==",
+      "dev": true,
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      }
+    },
     "node_modules/@faker-js/faker": {
       "version": "7.6.0",
       "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz",
@@ -4344,12 +4353,13 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.32.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz",
-      "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==",
+      "version": "8.35.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz",
+      "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==",
       "dev": true,
       "dependencies": {
-        "@eslint/eslintrc": "^1.4.1",
+        "@eslint/eslintrc": "^2.0.0",
+        "@eslint/js": "8.35.0",
         "@humanwhocodes/config-array": "^0.11.8",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
@@ -4363,7 +4373,7 @@
         "eslint-utils": "^3.0.0",
         "eslint-visitor-keys": "^3.3.0",
         "espree": "^9.4.0",
-        "esquery": "^1.4.0",
+        "esquery": "^1.4.2",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
         "file-entry-cache": "^6.0.1",
@@ -4581,9 +4591,9 @@
       }
     },
     "node_modules/esquery": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
-      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
+      "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
       "dev": true,
       "dependencies": {
         "estraverse": "^5.1.0"
@@ -5289,9 +5299,9 @@
       }
     },
     "node_modules/globals": {
-      "version": "13.19.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
-      "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
+      "version": "13.20.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+      "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
       "dev": true,
       "dependencies": {
         "type-fest": "^0.20.2"
@@ -10642,9 +10652,9 @@
       "dev": true
     },
     "@eslint/eslintrc": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz",
-      "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz",
+      "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==",
       "dev": true,
       "requires": {
         "ajv": "^6.12.4",
@@ -10694,6 +10704,12 @@
         }
       }
     },
+    "@eslint/js": {
+      "version": "8.35.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz",
+      "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==",
+      "dev": true
+    },
     "@faker-js/faker": {
       "version": "7.6.0",
       "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz",
@@ -13482,12 +13498,13 @@
       }
     },
     "eslint": {
-      "version": "8.32.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.32.0.tgz",
-      "integrity": "sha512-nETVXpnthqKPFyuY2FNjz/bEd6nbosRgKbkgS/y1C7LJop96gYHWpiguLecMHQ2XCPxn77DS0P+68WzG6vkZSQ==",
+      "version": "8.35.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz",
+      "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==",
       "dev": true,
       "requires": {
-        "@eslint/eslintrc": "^1.4.1",
+        "@eslint/eslintrc": "^2.0.0",
+        "@eslint/js": "8.35.0",
         "@humanwhocodes/config-array": "^0.11.8",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
@@ -13501,7 +13518,7 @@
         "eslint-utils": "^3.0.0",
         "eslint-visitor-keys": "^3.3.0",
         "espree": "^9.4.0",
-        "esquery": "^1.4.0",
+        "esquery": "^1.4.2",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
         "file-entry-cache": "^6.0.1",
@@ -13651,9 +13668,9 @@
       "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
     },
     "esquery": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
-      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
+      "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
       "dev": true,
       "requires": {
         "estraverse": "^5.1.0"
@@ -14173,9 +14190,9 @@
       }
     },
     "globals": {
-      "version": "13.19.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
-      "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
+      "version": "13.20.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
+      "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
       "dev": true,
       "requires": {
         "type-fest": "^0.20.2"
diff --git a/package.json b/package.json
index c73ef0a42af..023ef5c80bb 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,7 @@
     "xml-formatter": "^3.2.0"
   },
   "devDependencies": {
-    "eslint": "^8.32.0",
+    "eslint": "^8.35.0",
     "jest": "^29.3.1",
     "libxmljs2": "^0.31.0"
   },

From 865ad14a71cbf935cf520f601c90755f52cac662 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 12 Mar 2023 22:42:00 -0400
Subject: [PATCH 077/196] chore(deps): bump @primer/octicons from 17.10.2 to
 18.0.0 (#1393) [skip ci]

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 24b55e9270e..5fe90e873c9 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,7 @@
         "@octokit/graphql": "^5.0.4",
         "@octokit/rest": "^19.0.5",
         "@primer/css": "^20.8.0",
-        "@primer/octicons": "^17.10.2",
+        "@primer/octicons": "^18.0.0",
         "@twemoji/parser": "^14.1.0",
         "axios": "^1.2.2",
         "clipboard": "^2.0.11",
@@ -1991,9 +1991,9 @@
       }
     },
     "node_modules/@primer/octicons": {
-      "version": "17.10.2",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.2.tgz",
-      "integrity": "sha512-J/p2PcgT39Za4wpukbN6iUkEUvL5aE7Bs9kXBeEkrjEgc0Uu7J7B2ypwx9J0qM3m3lk2273RT5/4oGv8pfFLcg==",
+      "version": "18.0.0",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-18.0.0.tgz",
+      "integrity": "sha512-EC2T95Xl9FCt84pVROjGmwfBvDWxnvWxL+RGsWYNxr1qY7UO58WgLScgi7K8p4gSK5V/k9vHi/k1EhunIyRGRw==",
       "dependencies": {
         "object-assign": "^4.1.1"
       }
@@ -11692,9 +11692,9 @@
       }
     },
     "@primer/octicons": {
-      "version": "17.10.2",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-17.10.2.tgz",
-      "integrity": "sha512-J/p2PcgT39Za4wpukbN6iUkEUvL5aE7Bs9kXBeEkrjEgc0Uu7J7B2ypwx9J0qM3m3lk2273RT5/4oGv8pfFLcg==",
+      "version": "18.0.0",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-18.0.0.tgz",
+      "integrity": "sha512-EC2T95Xl9FCt84pVROjGmwfBvDWxnvWxL+RGsWYNxr1qY7UO58WgLScgi7K8p4gSK5V/k9vHi/k1EhunIyRGRw==",
       "requires": {
         "object-assign": "^4.1.1"
       }
diff --git a/package.json b/package.json
index 023ef5c80bb..2b128f9b4c9 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
     "@octokit/graphql": "^5.0.4",
     "@octokit/rest": "^19.0.5",
     "@primer/css": "^20.8.0",
-    "@primer/octicons": "^17.10.2",
+    "@primer/octicons": "^18.0.0",
     "@twemoji/parser": "^14.1.0",
     "axios": "^1.2.2",
     "clipboard": "^2.0.11",

From 954ab1996698b811e94e951b4b3556014f4e8113 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 12 Mar 2023 22:42:59 -0400
Subject: [PATCH 078/196] chore(deps): bump jest from 29.3.1 to 29.5.0 (#1394)
 [skip ci]

---
 package-lock.json | 1804 +++++++++++++++++++++++----------------------
 package.json      |    2 +-
 2 files changed, 934 insertions(+), 872 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 5fe90e873c9..891d2871918 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -51,7 +51,7 @@
       },
       "devDependencies": {
         "eslint": "^8.35.0",
-        "jest": "^29.3.1",
+        "jest": "^29.5.0",
         "libxmljs2": "^0.31.0"
       },
       "optionalDependencies": {
@@ -126,34 +126,34 @@
       }
     },
     "node_modules/@babel/compat-data": {
-      "version": "7.20.1",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
-      "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz",
+      "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.20.2",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz",
-      "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz",
+      "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==",
       "dev": true,
       "dependencies": {
-        "@ampproject/remapping": "^2.1.0",
+        "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.20.2",
-        "@babel/helper-compilation-targets": "^7.20.0",
-        "@babel/helper-module-transforms": "^7.20.2",
-        "@babel/helpers": "^7.20.1",
-        "@babel/parser": "^7.20.2",
-        "@babel/template": "^7.18.10",
-        "@babel/traverse": "^7.20.1",
-        "@babel/types": "^7.20.2",
+        "@babel/generator": "^7.21.0",
+        "@babel/helper-compilation-targets": "^7.20.7",
+        "@babel/helper-module-transforms": "^7.21.0",
+        "@babel/helpers": "^7.21.0",
+        "@babel/parser": "^7.21.0",
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.21.0",
+        "@babel/types": "^7.21.0",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.1",
+        "json5": "^2.2.2",
         "semver": "^6.3.0"
       },
       "engines": {
@@ -197,13 +197,14 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.20.4",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz",
-      "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==",
+      "version": "7.21.1",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz",
+      "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.20.2",
+        "@babel/types": "^7.21.0",
         "@jridgewell/gen-mapping": "^0.3.2",
+        "@jridgewell/trace-mapping": "^0.3.17",
         "jsesc": "^2.5.1"
       },
       "engines": {
@@ -225,14 +226,15 @@
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.20.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
-      "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+      "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
       "dev": true,
       "dependencies": {
-        "@babel/compat-data": "^7.20.0",
+        "@babel/compat-data": "^7.20.5",
         "@babel/helper-validator-option": "^7.18.6",
         "browserslist": "^4.21.3",
+        "lru-cache": "^5.1.1",
         "semver": "^6.3.0"
       },
       "engines": {
@@ -242,6 +244,15 @@
         "@babel/core": "^7.0.0"
       }
     },
+    "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
     "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -251,6 +262,12 @@
         "semver": "bin/semver.js"
       }
     },
+    "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true
+    },
     "node_modules/@babel/helper-environment-visitor": {
       "version": "7.18.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
@@ -261,13 +278,13 @@
       }
     },
     "node_modules/@babel/helper-function-name": {
-      "version": "7.19.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
-      "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
+      "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
       "dev": true,
       "dependencies": {
-        "@babel/template": "^7.18.10",
-        "@babel/types": "^7.19.0"
+        "@babel/template": "^7.20.7",
+        "@babel/types": "^7.21.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -298,9 +315,9 @@
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.20.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
-      "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
+      "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
       "dev": true,
       "dependencies": {
         "@babel/helper-environment-visitor": "^7.18.9",
@@ -308,9 +325,9 @@
         "@babel/helper-simple-access": "^7.20.2",
         "@babel/helper-split-export-declaration": "^7.18.6",
         "@babel/helper-validator-identifier": "^7.19.1",
-        "@babel/template": "^7.18.10",
-        "@babel/traverse": "^7.20.1",
-        "@babel/types": "^7.20.2"
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.21.2",
+        "@babel/types": "^7.21.2"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -367,23 +384,23 @@
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
-      "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
+      "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.20.1",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
-      "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
+      "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
       "dev": true,
       "dependencies": {
-        "@babel/template": "^7.18.10",
-        "@babel/traverse": "^7.20.1",
-        "@babel/types": "^7.20.0"
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.21.0",
+        "@babel/types": "^7.21.0"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -467,9 +484,9 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.20.3",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz",
-      "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==",
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz",
+      "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -655,33 +672,33 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
-      "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+      "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
       "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.18.6",
-        "@babel/parser": "^7.18.10",
-        "@babel/types": "^7.18.10"
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.20.1",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
-      "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz",
+      "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
       "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.20.1",
+        "@babel/generator": "^7.21.1",
         "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-function-name": "^7.19.0",
+        "@babel/helper-function-name": "^7.21.0",
         "@babel/helper-hoist-variables": "^7.18.6",
         "@babel/helper-split-export-declaration": "^7.18.6",
-        "@babel/parser": "^7.20.1",
-        "@babel/types": "^7.20.0",
+        "@babel/parser": "^7.21.2",
+        "@babel/types": "^7.21.2",
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       },
@@ -722,9 +739,9 @@
       "dev": true
     },
     "node_modules/@babel/types": {
-      "version": "7.20.2",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz",
-      "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==",
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz",
+      "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
       "dev": true,
       "dependencies": {
         "@babel/helper-string-parser": "^7.19.4",
@@ -1061,16 +1078,16 @@
       }
     },
     "node_modules/@jest/console": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz",
-      "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz",
+      "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
-        "jest-message-util": "^29.3.1",
-        "jest-util": "^29.3.1",
+        "jest-message-util": "^29.5.0",
+        "jest-util": "^29.5.0",
         "slash": "^3.0.0"
       },
       "engines": {
@@ -1078,37 +1095,37 @@
       }
     },
     "node_modules/@jest/core": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz",
-      "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz",
+      "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.3.1",
-        "@jest/reporters": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/console": "^29.5.0",
+        "@jest/reporters": "^29.5.0",
+        "@jest/test-result": "^29.5.0",
+        "@jest/transform": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
-        "jest-changed-files": "^29.2.0",
-        "jest-config": "^29.3.1",
-        "jest-haste-map": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-regex-util": "^29.2.0",
-        "jest-resolve": "^29.3.1",
-        "jest-resolve-dependencies": "^29.3.1",
-        "jest-runner": "^29.3.1",
-        "jest-runtime": "^29.3.1",
-        "jest-snapshot": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
-        "jest-watcher": "^29.3.1",
+        "jest-changed-files": "^29.5.0",
+        "jest-config": "^29.5.0",
+        "jest-haste-map": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-regex-util": "^29.4.3",
+        "jest-resolve": "^29.5.0",
+        "jest-resolve-dependencies": "^29.5.0",
+        "jest-runner": "^29.5.0",
+        "jest-runtime": "^29.5.0",
+        "jest-snapshot": "^29.5.0",
+        "jest-util": "^29.5.0",
+        "jest-validate": "^29.5.0",
+        "jest-watcher": "^29.5.0",
         "micromatch": "^4.0.4",
-        "pretty-format": "^29.3.1",
+        "pretty-format": "^29.5.0",
         "slash": "^3.0.0",
         "strip-ansi": "^6.0.0"
       },
@@ -1125,88 +1142,88 @@
       }
     },
     "node_modules/@jest/environment": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz",
-      "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz",
+      "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==",
       "dev": true,
       "dependencies": {
-        "@jest/fake-timers": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/fake-timers": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
-        "jest-mock": "^29.3.1"
+        "jest-mock": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/expect": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz",
-      "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz",
+      "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==",
       "dev": true,
       "dependencies": {
-        "expect": "^29.3.1",
-        "jest-snapshot": "^29.3.1"
+        "expect": "^29.5.0",
+        "jest-snapshot": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/expect-utils": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz",
-      "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz",
+      "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==",
       "dev": true,
       "dependencies": {
-        "jest-get-type": "^29.2.0"
+        "jest-get-type": "^29.4.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/fake-timers": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz",
-      "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz",
+      "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.3.1",
-        "@sinonjs/fake-timers": "^9.1.2",
+        "@jest/types": "^29.5.0",
+        "@sinonjs/fake-timers": "^10.0.2",
         "@types/node": "*",
-        "jest-message-util": "^29.3.1",
-        "jest-mock": "^29.3.1",
-        "jest-util": "^29.3.1"
+        "jest-message-util": "^29.5.0",
+        "jest-mock": "^29.5.0",
+        "jest-util": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/globals": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz",
-      "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz",
+      "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.3.1",
-        "@jest/expect": "^29.3.1",
-        "@jest/types": "^29.3.1",
-        "jest-mock": "^29.3.1"
+        "@jest/environment": "^29.5.0",
+        "@jest/expect": "^29.5.0",
+        "@jest/types": "^29.5.0",
+        "jest-mock": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/reporters": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz",
-      "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz",
+      "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==",
       "dev": true,
       "dependencies": {
         "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/console": "^29.5.0",
+        "@jest/test-result": "^29.5.0",
+        "@jest/transform": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@jridgewell/trace-mapping": "^0.3.15",
         "@types/node": "*",
         "chalk": "^4.0.0",
@@ -1219,9 +1236,9 @@
         "istanbul-lib-report": "^3.0.0",
         "istanbul-lib-source-maps": "^4.0.0",
         "istanbul-reports": "^3.1.3",
-        "jest-message-util": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-worker": "^29.3.1",
+        "jest-message-util": "^29.5.0",
+        "jest-util": "^29.5.0",
+        "jest-worker": "^29.5.0",
         "slash": "^3.0.0",
         "string-length": "^4.0.1",
         "strip-ansi": "^6.0.0",
@@ -1240,21 +1257,21 @@
       }
     },
     "node_modules/@jest/schemas": {
-      "version": "29.0.0",
-      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz",
-      "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
+      "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
       "dev": true,
       "dependencies": {
-        "@sinclair/typebox": "^0.24.1"
+        "@sinclair/typebox": "^0.25.16"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/source-map": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz",
-      "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz",
+      "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==",
       "dev": true,
       "dependencies": {
         "@jridgewell/trace-mapping": "^0.3.15",
@@ -1266,13 +1283,13 @@
       }
     },
     "node_modules/@jest/test-result": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz",
-      "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz",
+      "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/console": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/istanbul-lib-coverage": "^2.0.0",
         "collect-v8-coverage": "^1.0.0"
       },
@@ -1281,14 +1298,14 @@
       }
     },
     "node_modules/@jest/test-sequencer": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz",
-      "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz",
+      "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==",
       "dev": true,
       "dependencies": {
-        "@jest/test-result": "^29.3.1",
+        "@jest/test-result": "^29.5.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.3.1",
+        "jest-haste-map": "^29.5.0",
         "slash": "^3.0.0"
       },
       "engines": {
@@ -1296,26 +1313,26 @@
       }
     },
     "node_modules/@jest/transform": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz",
-      "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz",
+      "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@jridgewell/trace-mapping": "^0.3.15",
         "babel-plugin-istanbul": "^6.1.1",
         "chalk": "^4.0.0",
         "convert-source-map": "^2.0.0",
         "fast-json-stable-stringify": "^2.1.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.3.1",
-        "jest-regex-util": "^29.2.0",
-        "jest-util": "^29.3.1",
+        "jest-haste-map": "^29.5.0",
+        "jest-regex-util": "^29.4.3",
+        "jest-util": "^29.5.0",
         "micromatch": "^4.0.4",
         "pirates": "^4.0.4",
         "slash": "^3.0.0",
-        "write-file-atomic": "^4.0.1"
+        "write-file-atomic": "^4.0.2"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -1328,12 +1345,12 @@
       "dev": true
     },
     "node_modules/@jest/types": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz",
-      "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz",
+      "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==",
       "dev": true,
       "dependencies": {
-        "@jest/schemas": "^29.0.0",
+        "@jest/schemas": "^29.4.3",
         "@types/istanbul-lib-coverage": "^2.0.0",
         "@types/istanbul-reports": "^3.0.0",
         "@types/node": "*",
@@ -2021,9 +2038,9 @@
       }
     },
     "node_modules/@sinclair/typebox": {
-      "version": "0.24.51",
-      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
-      "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
+      "version": "0.25.24",
+      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
+      "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
       "dev": true
     },
     "node_modules/@sindresorhus/is": {
@@ -2038,21 +2055,21 @@
       }
     },
     "node_modules/@sinonjs/commons": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz",
-      "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
+      "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
       "dev": true,
       "dependencies": {
         "type-detect": "4.0.8"
       }
     },
     "node_modules/@sinonjs/fake-timers": {
-      "version": "9.1.2",
-      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
-      "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
+      "version": "10.0.2",
+      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz",
+      "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==",
       "dev": true,
       "dependencies": {
-        "@sinonjs/commons": "^1.7.0"
+        "@sinonjs/commons": "^2.0.0"
       }
     },
     "node_modules/@szmarczak/http-timer": {
@@ -2085,13 +2102,13 @@
       "integrity": "sha512-psQR5WEZjqSFy1gxJKpiMR9ygy59jykqIAAON8Xir78t9+E4z6S/BwYsksbylzJB1nCHKLzvkROrUHk2DKnEbg=="
     },
     "node_modules/@types/babel__core": {
-      "version": "7.1.20",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
-      "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==",
+      "version": "7.20.0",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
+      "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
       "dev": true,
       "dependencies": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0",
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
         "@types/babel__generator": "*",
         "@types/babel__template": "*",
         "@types/babel__traverse": "*"
@@ -2117,18 +2134,18 @@
       }
     },
     "node_modules/@types/babel__traverse": {
-      "version": "7.18.2",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz",
-      "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==",
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
+      "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
       "dev": true,
       "dependencies": {
         "@babel/types": "^7.3.0"
       }
     },
     "node_modules/@types/graceful-fs": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
-      "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+      "version": "4.1.6",
+      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+      "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
       "dev": true,
       "dependencies": {
         "@types/node": "*"
@@ -2170,9 +2187,9 @@
       "devOptional": true
     },
     "node_modules/@types/prettier": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
-      "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==",
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
+      "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
       "dev": true
     },
     "node_modules/@types/stack-utils": {
@@ -2182,9 +2199,9 @@
       "dev": true
     },
     "node_modules/@types/yargs": {
-      "version": "17.0.13",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz",
-      "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==",
+      "version": "17.0.22",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz",
+      "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==",
       "dev": true,
       "dependencies": {
         "@types/yargs-parser": "*"
@@ -2420,9 +2437,9 @@
       }
     },
     "node_modules/anymatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dev": true,
       "dependencies": {
         "normalize-path": "^3.0.0",
@@ -2541,15 +2558,15 @@
       }
     },
     "node_modules/babel-jest": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz",
-      "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz",
+      "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==",
       "dev": true,
       "dependencies": {
-        "@jest/transform": "^29.3.1",
+        "@jest/transform": "^29.5.0",
         "@types/babel__core": "^7.1.14",
         "babel-plugin-istanbul": "^6.1.1",
-        "babel-preset-jest": "^29.2.0",
+        "babel-preset-jest": "^29.5.0",
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
         "slash": "^3.0.0"
@@ -2578,9 +2595,9 @@
       }
     },
     "node_modules/babel-plugin-jest-hoist": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz",
-      "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz",
+      "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==",
       "dev": true,
       "dependencies": {
         "@babel/template": "^7.3.3",
@@ -2616,12 +2633,12 @@
       }
     },
     "node_modules/babel-preset-jest": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz",
-      "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz",
+      "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==",
       "dev": true,
       "dependencies": {
-        "babel-plugin-jest-hoist": "^29.2.0",
+        "babel-plugin-jest-hoist": "^29.5.0",
         "babel-preset-current-node-syntax": "^1.0.0"
       },
       "engines": {
@@ -2781,9 +2798,9 @@
       }
     },
     "node_modules/browserslist": {
-      "version": "4.21.4",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
-      "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+      "version": "4.21.5",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+      "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
       "dev": true,
       "funding": [
         {
@@ -2796,10 +2813,10 @@
         }
       ],
       "dependencies": {
-        "caniuse-lite": "^1.0.30001400",
-        "electron-to-chromium": "^1.4.251",
-        "node-releases": "^2.0.6",
-        "update-browserslist-db": "^1.0.9"
+        "caniuse-lite": "^1.0.30001449",
+        "electron-to-chromium": "^1.4.284",
+        "node-releases": "^2.0.8",
+        "update-browserslist-db": "^1.0.10"
       },
       "bin": {
         "browserslist": "cli.js"
@@ -2937,9 +2954,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001431",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz",
-      "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==",
+      "version": "1.0.30001464",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz",
+      "integrity": "sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g==",
       "dev": true,
       "funding": [
         {
@@ -3072,10 +3089,16 @@
       }
     },
     "node_modules/ci-info": {
-      "version": "3.6.1",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz",
-      "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==",
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
+      "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
       "dev": true,
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/sibiraj-s"
+        }
+      ],
       "engines": {
         "node": ">=8"
       }
@@ -4054,9 +4077,9 @@
       "integrity": "sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ=="
     },
     "node_modules/diff-sequences": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz",
-      "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
+      "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
       "dev": true,
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -4175,9 +4198,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.284",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
-      "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+      "version": "1.4.328",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.328.tgz",
+      "integrity": "sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==",
       "dev": true
     },
     "node_modules/emittery": {
@@ -4691,16 +4714,16 @@
       }
     },
     "node_modules/expect": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz",
-      "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz",
+      "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==",
       "dev": true,
       "dependencies": {
-        "@jest/expect-utils": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "jest-matcher-utils": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-util": "^29.3.1"
+        "@jest/expect-utils": "^29.5.0",
+        "jest-get-type": "^29.4.3",
+        "jest-matcher-utils": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-util": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -5990,15 +6013,15 @@
       }
     },
     "node_modules/jest": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz",
-      "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
+      "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/core": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "import-local": "^3.0.2",
-        "jest-cli": "^29.3.1"
+        "jest-cli": "^29.5.0"
       },
       "bin": {
         "jest": "bin/jest.js"
@@ -6016,9 +6039,9 @@
       }
     },
     "node_modules/jest-changed-files": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz",
-      "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz",
+      "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==",
       "dev": true,
       "dependencies": {
         "execa": "^5.0.0",
@@ -6029,28 +6052,29 @@
       }
     },
     "node_modules/jest-circus": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz",
-      "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz",
+      "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.3.1",
-        "@jest/expect": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/environment": "^29.5.0",
+        "@jest/expect": "^29.5.0",
+        "@jest/test-result": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "co": "^4.6.0",
         "dedent": "^0.7.0",
         "is-generator-fn": "^2.0.0",
-        "jest-each": "^29.3.1",
-        "jest-matcher-utils": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-runtime": "^29.3.1",
-        "jest-snapshot": "^29.3.1",
-        "jest-util": "^29.3.1",
+        "jest-each": "^29.5.0",
+        "jest-matcher-utils": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-runtime": "^29.5.0",
+        "jest-snapshot": "^29.5.0",
+        "jest-util": "^29.5.0",
         "p-limit": "^3.1.0",
-        "pretty-format": "^29.3.1",
+        "pretty-format": "^29.5.0",
+        "pure-rand": "^6.0.0",
         "slash": "^3.0.0",
         "stack-utils": "^2.0.3"
       },
@@ -6059,21 +6083,21 @@
       }
     },
     "node_modules/jest-cli": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz",
-      "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz",
+      "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/core": "^29.5.0",
+        "@jest/test-result": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "chalk": "^4.0.0",
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
         "import-local": "^3.0.2",
-        "jest-config": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
+        "jest-config": "^29.5.0",
+        "jest-util": "^29.5.0",
+        "jest-validate": "^29.5.0",
         "prompts": "^2.0.1",
         "yargs": "^17.3.1"
       },
@@ -6093,31 +6117,31 @@
       }
     },
     "node_modules/jest-config": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz",
-      "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz",
+      "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
-        "@jest/test-sequencer": "^29.3.1",
-        "@jest/types": "^29.3.1",
-        "babel-jest": "^29.3.1",
+        "@jest/test-sequencer": "^29.5.0",
+        "@jest/types": "^29.5.0",
+        "babel-jest": "^29.5.0",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
         "deepmerge": "^4.2.2",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-circus": "^29.3.1",
-        "jest-environment-node": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "jest-regex-util": "^29.2.0",
-        "jest-resolve": "^29.3.1",
-        "jest-runner": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
+        "jest-circus": "^29.5.0",
+        "jest-environment-node": "^29.5.0",
+        "jest-get-type": "^29.4.3",
+        "jest-regex-util": "^29.4.3",
+        "jest-resolve": "^29.5.0",
+        "jest-runner": "^29.5.0",
+        "jest-util": "^29.5.0",
+        "jest-validate": "^29.5.0",
         "micromatch": "^4.0.4",
         "parse-json": "^5.2.0",
-        "pretty-format": "^29.3.1",
+        "pretty-format": "^29.5.0",
         "slash": "^3.0.0",
         "strip-json-comments": "^3.1.1"
       },
@@ -6138,24 +6162,24 @@
       }
     },
     "node_modules/jest-diff": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz",
-      "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
+      "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
-        "diff-sequences": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
+        "diff-sequences": "^29.4.3",
+        "jest-get-type": "^29.4.3",
+        "pretty-format": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-docblock": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz",
-      "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz",
+      "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==",
       "dev": true,
       "dependencies": {
         "detect-newline": "^3.0.0"
@@ -6165,62 +6189,62 @@
       }
     },
     "node_modules/jest-each": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz",
-      "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz",
+      "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "chalk": "^4.0.0",
-        "jest-get-type": "^29.2.0",
-        "jest-util": "^29.3.1",
-        "pretty-format": "^29.3.1"
+        "jest-get-type": "^29.4.3",
+        "jest-util": "^29.5.0",
+        "pretty-format": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-environment-node": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz",
-      "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz",
+      "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.3.1",
-        "@jest/fake-timers": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/environment": "^29.5.0",
+        "@jest/fake-timers": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
-        "jest-mock": "^29.3.1",
-        "jest-util": "^29.3.1"
+        "jest-mock": "^29.5.0",
+        "jest-util": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-get-type": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz",
-      "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
+      "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
       "dev": true,
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-haste-map": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz",
-      "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz",
+      "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@types/graceful-fs": "^4.1.3",
         "@types/node": "*",
         "anymatch": "^3.0.3",
         "fb-watchman": "^2.0.0",
         "graceful-fs": "^4.2.9",
-        "jest-regex-util": "^29.2.0",
-        "jest-util": "^29.3.1",
-        "jest-worker": "^29.3.1",
+        "jest-regex-util": "^29.4.3",
+        "jest-util": "^29.5.0",
+        "jest-worker": "^29.5.0",
         "micromatch": "^4.0.4",
         "walker": "^1.0.8"
       },
@@ -6232,46 +6256,46 @@
       }
     },
     "node_modules/jest-leak-detector": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz",
-      "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz",
+      "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==",
       "dev": true,
       "dependencies": {
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
+        "jest-get-type": "^29.4.3",
+        "pretty-format": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-matcher-utils": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz",
-      "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz",
+      "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
-        "jest-diff": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
+        "jest-diff": "^29.5.0",
+        "jest-get-type": "^29.4.3",
+        "pretty-format": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-message-util": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz",
-      "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz",
+      "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==",
       "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.12.13",
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@types/stack-utils": "^2.0.0",
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
         "micromatch": "^4.0.4",
-        "pretty-format": "^29.3.1",
+        "pretty-format": "^29.5.0",
         "slash": "^3.0.0",
         "stack-utils": "^2.0.3"
       },
@@ -6280,23 +6304,23 @@
       }
     },
     "node_modules/jest-mock": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz",
-      "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz",
+      "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
-        "jest-util": "^29.3.1"
+        "jest-util": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-pnp-resolver": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
       "dev": true,
       "engines": {
         "node": ">=6"
@@ -6311,28 +6335,28 @@
       }
     },
     "node_modules/jest-regex-util": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz",
-      "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz",
+      "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==",
       "dev": true,
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-resolve": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz",
-      "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz",
+      "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.3.1",
+        "jest-haste-map": "^29.5.0",
         "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
+        "jest-util": "^29.5.0",
+        "jest-validate": "^29.5.0",
         "resolve": "^1.20.0",
-        "resolve.exports": "^1.1.0",
+        "resolve.exports": "^2.0.0",
         "slash": "^3.0.0"
       },
       "engines": {
@@ -6340,43 +6364,43 @@
       }
     },
     "node_modules/jest-resolve-dependencies": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz",
-      "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz",
+      "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==",
       "dev": true,
       "dependencies": {
-        "jest-regex-util": "^29.2.0",
-        "jest-snapshot": "^29.3.1"
+        "jest-regex-util": "^29.4.3",
+        "jest-snapshot": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-runner": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz",
-      "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz",
+      "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.3.1",
-        "@jest/environment": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/console": "^29.5.0",
+        "@jest/environment": "^29.5.0",
+        "@jest/test-result": "^29.5.0",
+        "@jest/transform": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
         "graceful-fs": "^4.2.9",
-        "jest-docblock": "^29.2.0",
-        "jest-environment-node": "^29.3.1",
-        "jest-haste-map": "^29.3.1",
-        "jest-leak-detector": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-resolve": "^29.3.1",
-        "jest-runtime": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-watcher": "^29.3.1",
-        "jest-worker": "^29.3.1",
+        "jest-docblock": "^29.4.3",
+        "jest-environment-node": "^29.5.0",
+        "jest-haste-map": "^29.5.0",
+        "jest-leak-detector": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-resolve": "^29.5.0",
+        "jest-runtime": "^29.5.0",
+        "jest-util": "^29.5.0",
+        "jest-watcher": "^29.5.0",
+        "jest-worker": "^29.5.0",
         "p-limit": "^3.1.0",
         "source-map-support": "0.5.13"
       },
@@ -6385,31 +6409,31 @@
       }
     },
     "node_modules/jest-runtime": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz",
-      "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^29.3.1",
-        "@jest/fake-timers": "^29.3.1",
-        "@jest/globals": "^29.3.1",
-        "@jest/source-map": "^29.2.0",
-        "@jest/test-result": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz",
+      "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==",
+      "dev": true,
+      "dependencies": {
+        "@jest/environment": "^29.5.0",
+        "@jest/fake-timers": "^29.5.0",
+        "@jest/globals": "^29.5.0",
+        "@jest/source-map": "^29.4.3",
+        "@jest/test-result": "^29.5.0",
+        "@jest/transform": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "cjs-module-lexer": "^1.0.0",
         "collect-v8-coverage": "^1.0.0",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-mock": "^29.3.1",
-        "jest-regex-util": "^29.2.0",
-        "jest-resolve": "^29.3.1",
-        "jest-snapshot": "^29.3.1",
-        "jest-util": "^29.3.1",
+        "jest-haste-map": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-mock": "^29.5.0",
+        "jest-regex-util": "^29.4.3",
+        "jest-resolve": "^29.5.0",
+        "jest-snapshot": "^29.5.0",
+        "jest-util": "^29.5.0",
         "slash": "^3.0.0",
         "strip-bom": "^4.0.0"
       },
@@ -6418,9 +6442,9 @@
       }
     },
     "node_modules/jest-snapshot": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz",
-      "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz",
+      "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
@@ -6429,23 +6453,22 @@
         "@babel/plugin-syntax-typescript": "^7.7.2",
         "@babel/traverse": "^7.7.2",
         "@babel/types": "^7.3.3",
-        "@jest/expect-utils": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/expect-utils": "^29.5.0",
+        "@jest/transform": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/babel__traverse": "^7.0.6",
         "@types/prettier": "^2.1.5",
         "babel-preset-current-node-syntax": "^1.0.0",
         "chalk": "^4.0.0",
-        "expect": "^29.3.1",
+        "expect": "^29.5.0",
         "graceful-fs": "^4.2.9",
-        "jest-diff": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "jest-haste-map": "^29.3.1",
-        "jest-matcher-utils": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-util": "^29.3.1",
+        "jest-diff": "^29.5.0",
+        "jest-get-type": "^29.4.3",
+        "jest-matcher-utils": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-util": "^29.5.0",
         "natural-compare": "^1.4.0",
-        "pretty-format": "^29.3.1",
+        "pretty-format": "^29.5.0",
         "semver": "^7.3.5"
       },
       "engines": {
@@ -6453,12 +6476,12 @@
       }
     },
     "node_modules/jest-util": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz",
-      "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
+      "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
@@ -6470,17 +6493,17 @@
       }
     },
     "node_modules/jest-validate": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz",
-      "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz",
+      "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "camelcase": "^6.2.0",
         "chalk": "^4.0.0",
-        "jest-get-type": "^29.2.0",
+        "jest-get-type": "^29.4.3",
         "leven": "^3.1.0",
-        "pretty-format": "^29.3.1"
+        "pretty-format": "^29.5.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -6499,18 +6522,18 @@
       }
     },
     "node_modules/jest-watcher": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz",
-      "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz",
+      "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==",
       "dev": true,
       "dependencies": {
-        "@jest/test-result": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/test-result": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
-        "jest-util": "^29.3.1",
+        "jest-util": "^29.5.0",
         "string-length": "^4.0.1"
       },
       "engines": {
@@ -6518,13 +6541,13 @@
       }
     },
     "node_modules/jest-worker": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz",
-      "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz",
+      "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==",
       "dev": true,
       "dependencies": {
         "@types/node": "*",
-        "jest-util": "^29.3.1",
+        "jest-util": "^29.5.0",
         "merge-stream": "^2.0.0",
         "supports-color": "^8.0.0"
       },
@@ -7498,9 +7521,9 @@
       "dev": true
     },
     "node_modules/node-releases": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
-      "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+      "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
       "dev": true
     },
     "node_modules/nodegit-promise": {
@@ -8040,12 +8063,12 @@
       }
     },
     "node_modules/pretty-format": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz",
-      "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
+      "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
       "dev": true,
       "dependencies": {
-        "@jest/schemas": "^29.0.0",
+        "@jest/schemas": "^29.4.3",
         "ansi-styles": "^5.0.0",
         "react-is": "^18.0.0"
       },
@@ -8205,6 +8228,22 @@
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
+    "node_modules/pure-rand": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz",
+      "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==",
+      "dev": true,
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/dubzzz"
+        },
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fast-check"
+        }
+      ]
+    },
     "node_modules/purgecss": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-5.0.0.tgz",
@@ -8593,9 +8632,9 @@
       }
     },
     "node_modules/resolve.exports": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
-      "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz",
+      "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==",
       "dev": true,
       "engines": {
         "node": ">=10"
@@ -9795,9 +9834,9 @@
       }
     },
     "node_modules/v8-to-istanbul": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz",
-      "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==",
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
+      "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
       "dev": true,
       "dependencies": {
         "@jridgewell/trace-mapping": "^0.3.12",
@@ -10090,9 +10129,9 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
     },
     "node_modules/yargs": {
-      "version": "17.6.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz",
-      "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==",
+      "version": "17.7.1",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
+      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
       "dev": true,
       "dependencies": {
         "cliui": "^8.0.1",
@@ -10193,31 +10232,31 @@
       }
     },
     "@babel/compat-data": {
-      "version": "7.20.1",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz",
-      "integrity": "sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz",
+      "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==",
       "dev": true
     },
     "@babel/core": {
-      "version": "7.20.2",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz",
-      "integrity": "sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz",
+      "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==",
       "dev": true,
       "requires": {
-        "@ampproject/remapping": "^2.1.0",
+        "@ampproject/remapping": "^2.2.0",
         "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.20.2",
-        "@babel/helper-compilation-targets": "^7.20.0",
-        "@babel/helper-module-transforms": "^7.20.2",
-        "@babel/helpers": "^7.20.1",
-        "@babel/parser": "^7.20.2",
-        "@babel/template": "^7.18.10",
-        "@babel/traverse": "^7.20.1",
-        "@babel/types": "^7.20.2",
+        "@babel/generator": "^7.21.0",
+        "@babel/helper-compilation-targets": "^7.20.7",
+        "@babel/helper-module-transforms": "^7.21.0",
+        "@babel/helpers": "^7.21.0",
+        "@babel/parser": "^7.21.0",
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.21.0",
+        "@babel/types": "^7.21.0",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.1",
+        "json5": "^2.2.2",
         "semver": "^6.3.0"
       },
       "dependencies": {
@@ -10245,13 +10284,14 @@
       }
     },
     "@babel/generator": {
-      "version": "7.20.4",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.4.tgz",
-      "integrity": "sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==",
+      "version": "7.21.1",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz",
+      "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.20.2",
+        "@babel/types": "^7.21.0",
         "@jridgewell/gen-mapping": "^0.3.2",
+        "@jridgewell/trace-mapping": "^0.3.17",
         "jsesc": "^2.5.1"
       },
       "dependencies": {
@@ -10269,22 +10309,38 @@
       }
     },
     "@babel/helper-compilation-targets": {
-      "version": "7.20.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
-      "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
+      "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
       "dev": true,
       "requires": {
-        "@babel/compat-data": "^7.20.0",
+        "@babel/compat-data": "^7.20.5",
         "@babel/helper-validator-option": "^7.18.6",
         "browserslist": "^4.21.3",
+        "lru-cache": "^5.1.1",
         "semver": "^6.3.0"
       },
       "dependencies": {
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "dev": true,
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
         "semver": {
           "version": "6.3.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
           "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
           "dev": true
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+          "dev": true
         }
       }
     },
@@ -10295,13 +10351,13 @@
       "dev": true
     },
     "@babel/helper-function-name": {
-      "version": "7.19.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
-      "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
+      "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.18.10",
-        "@babel/types": "^7.19.0"
+        "@babel/template": "^7.20.7",
+        "@babel/types": "^7.21.0"
       }
     },
     "@babel/helper-hoist-variables": {
@@ -10323,9 +10379,9 @@
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.20.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
-      "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
+      "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
       "dev": true,
       "requires": {
         "@babel/helper-environment-visitor": "^7.18.9",
@@ -10333,9 +10389,9 @@
         "@babel/helper-simple-access": "^7.20.2",
         "@babel/helper-split-export-declaration": "^7.18.6",
         "@babel/helper-validator-identifier": "^7.19.1",
-        "@babel/template": "^7.18.10",
-        "@babel/traverse": "^7.20.1",
-        "@babel/types": "^7.20.2"
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.21.2",
+        "@babel/types": "^7.21.2"
       }
     },
     "@babel/helper-plugin-utils": {
@@ -10374,20 +10430,20 @@
       "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
     },
     "@babel/helper-validator-option": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
-      "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
+      "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
       "dev": true
     },
     "@babel/helpers": {
-      "version": "7.20.1",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz",
-      "integrity": "sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==",
+      "version": "7.21.0",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
+      "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.18.10",
-        "@babel/traverse": "^7.20.1",
-        "@babel/types": "^7.20.0"
+        "@babel/template": "^7.20.7",
+        "@babel/traverse": "^7.21.0",
+        "@babel/types": "^7.21.0"
       }
     },
     "@babel/highlight": {
@@ -10452,9 +10508,9 @@
       }
     },
     "@babel/parser": {
-      "version": "7.20.3",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.3.tgz",
-      "integrity": "sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg=="
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz",
+      "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ=="
     },
     "@babel/plugin-syntax-async-generators": {
       "version": "7.8.4",
@@ -10583,30 +10639,30 @@
       }
     },
     "@babel/template": {
-      "version": "7.18.10",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
-      "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+      "version": "7.20.7",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
+      "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.18.6",
-        "@babel/parser": "^7.18.10",
-        "@babel/types": "^7.18.10"
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7"
       }
     },
     "@babel/traverse": {
-      "version": "7.20.1",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.1.tgz",
-      "integrity": "sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==",
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz",
+      "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.20.1",
+        "@babel/generator": "^7.21.1",
         "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-function-name": "^7.19.0",
+        "@babel/helper-function-name": "^7.21.0",
         "@babel/helper-hoist-variables": "^7.18.6",
         "@babel/helper-split-export-declaration": "^7.18.6",
-        "@babel/parser": "^7.20.1",
-        "@babel/types": "^7.20.0",
+        "@babel/parser": "^7.21.2",
+        "@babel/types": "^7.21.2",
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       },
@@ -10635,9 +10691,9 @@
       }
     },
     "@babel/types": {
-      "version": "7.20.2",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz",
-      "integrity": "sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==",
+      "version": "7.21.2",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz",
+      "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
       "dev": true,
       "requires": {
         "@babel/helper-string-parser": "^7.19.4",
@@ -10924,123 +10980,123 @@
       "dev": true
     },
     "@jest/console": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz",
-      "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz",
+      "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==",
       "dev": true,
       "requires": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
-        "jest-message-util": "^29.3.1",
-        "jest-util": "^29.3.1",
+        "jest-message-util": "^29.5.0",
+        "jest-util": "^29.5.0",
         "slash": "^3.0.0"
       }
     },
     "@jest/core": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz",
-      "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz",
+      "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==",
       "dev": true,
       "requires": {
-        "@jest/console": "^29.3.1",
-        "@jest/reporters": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/console": "^29.5.0",
+        "@jest/reporters": "^29.5.0",
+        "@jest/test-result": "^29.5.0",
+        "@jest/transform": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
-        "jest-changed-files": "^29.2.0",
-        "jest-config": "^29.3.1",
-        "jest-haste-map": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-regex-util": "^29.2.0",
-        "jest-resolve": "^29.3.1",
-        "jest-resolve-dependencies": "^29.3.1",
-        "jest-runner": "^29.3.1",
-        "jest-runtime": "^29.3.1",
-        "jest-snapshot": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
-        "jest-watcher": "^29.3.1",
+        "jest-changed-files": "^29.5.0",
+        "jest-config": "^29.5.0",
+        "jest-haste-map": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-regex-util": "^29.4.3",
+        "jest-resolve": "^29.5.0",
+        "jest-resolve-dependencies": "^29.5.0",
+        "jest-runner": "^29.5.0",
+        "jest-runtime": "^29.5.0",
+        "jest-snapshot": "^29.5.0",
+        "jest-util": "^29.5.0",
+        "jest-validate": "^29.5.0",
+        "jest-watcher": "^29.5.0",
         "micromatch": "^4.0.4",
-        "pretty-format": "^29.3.1",
+        "pretty-format": "^29.5.0",
         "slash": "^3.0.0",
         "strip-ansi": "^6.0.0"
       }
     },
     "@jest/environment": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz",
-      "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz",
+      "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==",
       "dev": true,
       "requires": {
-        "@jest/fake-timers": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/fake-timers": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
-        "jest-mock": "^29.3.1"
+        "jest-mock": "^29.5.0"
       }
     },
     "@jest/expect": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz",
-      "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz",
+      "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==",
       "dev": true,
       "requires": {
-        "expect": "^29.3.1",
-        "jest-snapshot": "^29.3.1"
+        "expect": "^29.5.0",
+        "jest-snapshot": "^29.5.0"
       }
     },
     "@jest/expect-utils": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz",
-      "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz",
+      "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==",
       "dev": true,
       "requires": {
-        "jest-get-type": "^29.2.0"
+        "jest-get-type": "^29.4.3"
       }
     },
     "@jest/fake-timers": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz",
-      "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz",
+      "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==",
       "dev": true,
       "requires": {
-        "@jest/types": "^29.3.1",
-        "@sinonjs/fake-timers": "^9.1.2",
+        "@jest/types": "^29.5.0",
+        "@sinonjs/fake-timers": "^10.0.2",
         "@types/node": "*",
-        "jest-message-util": "^29.3.1",
-        "jest-mock": "^29.3.1",
-        "jest-util": "^29.3.1"
+        "jest-message-util": "^29.5.0",
+        "jest-mock": "^29.5.0",
+        "jest-util": "^29.5.0"
       }
     },
     "@jest/globals": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz",
-      "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz",
+      "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==",
       "dev": true,
       "requires": {
-        "@jest/environment": "^29.3.1",
-        "@jest/expect": "^29.3.1",
-        "@jest/types": "^29.3.1",
-        "jest-mock": "^29.3.1"
+        "@jest/environment": "^29.5.0",
+        "@jest/expect": "^29.5.0",
+        "@jest/types": "^29.5.0",
+        "jest-mock": "^29.5.0"
       }
     },
     "@jest/reporters": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz",
-      "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz",
+      "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==",
       "dev": true,
       "requires": {
         "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/console": "^29.5.0",
+        "@jest/test-result": "^29.5.0",
+        "@jest/transform": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@jridgewell/trace-mapping": "^0.3.15",
         "@types/node": "*",
         "chalk": "^4.0.0",
@@ -11053,9 +11109,9 @@
         "istanbul-lib-report": "^3.0.0",
         "istanbul-lib-source-maps": "^4.0.0",
         "istanbul-reports": "^3.1.3",
-        "jest-message-util": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-worker": "^29.3.1",
+        "jest-message-util": "^29.5.0",
+        "jest-util": "^29.5.0",
+        "jest-worker": "^29.5.0",
         "slash": "^3.0.0",
         "string-length": "^4.0.1",
         "strip-ansi": "^6.0.0",
@@ -11063,18 +11119,18 @@
       }
     },
     "@jest/schemas": {
-      "version": "29.0.0",
-      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz",
-      "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
+      "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
       "dev": true,
       "requires": {
-        "@sinclair/typebox": "^0.24.1"
+        "@sinclair/typebox": "^0.25.16"
       }
     },
     "@jest/source-map": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz",
-      "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz",
+      "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==",
       "dev": true,
       "requires": {
         "@jridgewell/trace-mapping": "^0.3.15",
@@ -11083,50 +11139,50 @@
       }
     },
     "@jest/test-result": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz",
-      "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz",
+      "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==",
       "dev": true,
       "requires": {
-        "@jest/console": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/console": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/istanbul-lib-coverage": "^2.0.0",
         "collect-v8-coverage": "^1.0.0"
       }
     },
     "@jest/test-sequencer": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz",
-      "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz",
+      "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==",
       "dev": true,
       "requires": {
-        "@jest/test-result": "^29.3.1",
+        "@jest/test-result": "^29.5.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.3.1",
+        "jest-haste-map": "^29.5.0",
         "slash": "^3.0.0"
       }
     },
     "@jest/transform": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz",
-      "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz",
+      "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==",
       "dev": true,
       "requires": {
         "@babel/core": "^7.11.6",
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@jridgewell/trace-mapping": "^0.3.15",
         "babel-plugin-istanbul": "^6.1.1",
         "chalk": "^4.0.0",
         "convert-source-map": "^2.0.0",
         "fast-json-stable-stringify": "^2.1.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.3.1",
-        "jest-regex-util": "^29.2.0",
-        "jest-util": "^29.3.1",
+        "jest-haste-map": "^29.5.0",
+        "jest-regex-util": "^29.4.3",
+        "jest-util": "^29.5.0",
         "micromatch": "^4.0.4",
         "pirates": "^4.0.4",
         "slash": "^3.0.0",
-        "write-file-atomic": "^4.0.1"
+        "write-file-atomic": "^4.0.2"
       },
       "dependencies": {
         "convert-source-map": {
@@ -11138,12 +11194,12 @@
       }
     },
     "@jest/types": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz",
-      "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz",
+      "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==",
       "dev": true,
       "requires": {
-        "@jest/schemas": "^29.0.0",
+        "@jest/schemas": "^29.4.3",
         "@types/istanbul-lib-coverage": "^2.0.0",
         "@types/istanbul-reports": "^3.0.0",
         "@types/node": "*",
@@ -11722,9 +11778,9 @@
       }
     },
     "@sinclair/typebox": {
-      "version": "0.24.51",
-      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
-      "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
+      "version": "0.25.24",
+      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
+      "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
       "dev": true
     },
     "@sindresorhus/is": {
@@ -11733,21 +11789,21 @@
       "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw=="
     },
     "@sinonjs/commons": {
-      "version": "1.8.5",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz",
-      "integrity": "sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
+      "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
       "dev": true,
       "requires": {
         "type-detect": "4.0.8"
       }
     },
     "@sinonjs/fake-timers": {
-      "version": "9.1.2",
-      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
-      "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
+      "version": "10.0.2",
+      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz",
+      "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==",
       "dev": true,
       "requires": {
-        "@sinonjs/commons": "^1.7.0"
+        "@sinonjs/commons": "^2.0.0"
       }
     },
     "@szmarczak/http-timer": {
@@ -11774,13 +11830,13 @@
       "integrity": "sha512-psQR5WEZjqSFy1gxJKpiMR9ygy59jykqIAAON8Xir78t9+E4z6S/BwYsksbylzJB1nCHKLzvkROrUHk2DKnEbg=="
     },
     "@types/babel__core": {
-      "version": "7.1.20",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
-      "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==",
+      "version": "7.20.0",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
+      "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
       "dev": true,
       "requires": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0",
+        "@babel/parser": "^7.20.7",
+        "@babel/types": "^7.20.7",
         "@types/babel__generator": "*",
         "@types/babel__template": "*",
         "@types/babel__traverse": "*"
@@ -11806,18 +11862,18 @@
       }
     },
     "@types/babel__traverse": {
-      "version": "7.18.2",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz",
-      "integrity": "sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==",
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
+      "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
       "dev": true,
       "requires": {
         "@babel/types": "^7.3.0"
       }
     },
     "@types/graceful-fs": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
-      "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+      "version": "4.1.6",
+      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+      "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
       "dev": true,
       "requires": {
         "@types/node": "*"
@@ -11859,9 +11915,9 @@
       "devOptional": true
     },
     "@types/prettier": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
-      "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==",
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
+      "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
       "dev": true
     },
     "@types/stack-utils": {
@@ -11871,9 +11927,9 @@
       "dev": true
     },
     "@types/yargs": {
-      "version": "17.0.13",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz",
-      "integrity": "sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==",
+      "version": "17.0.22",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz",
+      "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==",
       "dev": true,
       "requires": {
         "@types/yargs-parser": "*"
@@ -12053,9 +12109,9 @@
       }
     },
     "anymatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
-      "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
       "dev": true,
       "requires": {
         "normalize-path": "^3.0.0",
@@ -12161,15 +12217,15 @@
       }
     },
     "babel-jest": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz",
-      "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz",
+      "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==",
       "dev": true,
       "requires": {
-        "@jest/transform": "^29.3.1",
+        "@jest/transform": "^29.5.0",
         "@types/babel__core": "^7.1.14",
         "babel-plugin-istanbul": "^6.1.1",
-        "babel-preset-jest": "^29.2.0",
+        "babel-preset-jest": "^29.5.0",
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
         "slash": "^3.0.0"
@@ -12189,9 +12245,9 @@
       }
     },
     "babel-plugin-jest-hoist": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz",
-      "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz",
+      "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==",
       "dev": true,
       "requires": {
         "@babel/template": "^7.3.3",
@@ -12221,12 +12277,12 @@
       }
     },
     "babel-preset-jest": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz",
-      "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz",
+      "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==",
       "dev": true,
       "requires": {
-        "babel-plugin-jest-hoist": "^29.2.0",
+        "babel-plugin-jest-hoist": "^29.5.0",
         "babel-preset-current-node-syntax": "^1.0.0"
       }
     },
@@ -12351,15 +12407,15 @@
       }
     },
     "browserslist": {
-      "version": "4.21.4",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
-      "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+      "version": "4.21.5",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
+      "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
       "dev": true,
       "requires": {
-        "caniuse-lite": "^1.0.30001400",
-        "electron-to-chromium": "^1.4.251",
-        "node-releases": "^2.0.6",
-        "update-browserslist-db": "^1.0.9"
+        "caniuse-lite": "^1.0.30001449",
+        "electron-to-chromium": "^1.4.284",
+        "node-releases": "^2.0.8",
+        "update-browserslist-db": "^1.0.10"
       }
     },
     "bser": {
@@ -12449,9 +12505,9 @@
       "dev": true
     },
     "caniuse-lite": {
-      "version": "1.0.30001431",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz",
-      "integrity": "sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==",
+      "version": "1.0.30001464",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz",
+      "integrity": "sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g==",
       "dev": true
     },
     "canvas": {
@@ -12543,9 +12599,9 @@
       "devOptional": true
     },
     "ci-info": {
-      "version": "3.6.1",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.6.1.tgz",
-      "integrity": "sha512-up5ggbaDqOqJ4UqLKZ2naVkyqSJQgJi5lwD6b6mM748ysrghDBX0bx/qJTUHzw7zu6Mq4gycviSF5hJnwceD8w==",
+      "version": "3.8.0",
+      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
+      "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
       "dev": true
     },
     "cjs-module-lexer": {
@@ -13276,9 +13332,9 @@
       "integrity": "sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ=="
     },
     "diff-sequences": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz",
-      "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
+      "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
       "dev": true
     },
     "doctrine": {
@@ -13363,9 +13419,9 @@
       }
     },
     "electron-to-chromium": {
-      "version": "1.4.284",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
-      "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+      "version": "1.4.328",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.328.tgz",
+      "integrity": "sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==",
       "dev": true
     },
     "emittery": {
@@ -13737,16 +13793,16 @@
       "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="
     },
     "expect": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz",
-      "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz",
+      "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==",
       "dev": true,
       "requires": {
-        "@jest/expect-utils": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "jest-matcher-utils": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-util": "^29.3.1"
+        "@jest/expect-utils": "^29.5.0",
+        "jest-get-type": "^29.4.3",
+        "jest-matcher-utils": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-util": "^29.5.0"
       }
     },
     "express": {
@@ -14697,21 +14753,21 @@
       }
     },
     "jest": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz",
-      "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
+      "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==",
       "dev": true,
       "requires": {
-        "@jest/core": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/core": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "import-local": "^3.0.2",
-        "jest-cli": "^29.3.1"
+        "jest-cli": "^29.5.0"
       }
     },
     "jest-changed-files": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz",
-      "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz",
+      "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==",
       "dev": true,
       "requires": {
         "execa": "^5.0.0",
@@ -14719,309 +14775,310 @@
       }
     },
     "jest-circus": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz",
-      "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz",
+      "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==",
       "dev": true,
       "requires": {
-        "@jest/environment": "^29.3.1",
-        "@jest/expect": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/environment": "^29.5.0",
+        "@jest/expect": "^29.5.0",
+        "@jest/test-result": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "co": "^4.6.0",
         "dedent": "^0.7.0",
         "is-generator-fn": "^2.0.0",
-        "jest-each": "^29.3.1",
-        "jest-matcher-utils": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-runtime": "^29.3.1",
-        "jest-snapshot": "^29.3.1",
-        "jest-util": "^29.3.1",
+        "jest-each": "^29.5.0",
+        "jest-matcher-utils": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-runtime": "^29.5.0",
+        "jest-snapshot": "^29.5.0",
+        "jest-util": "^29.5.0",
         "p-limit": "^3.1.0",
-        "pretty-format": "^29.3.1",
+        "pretty-format": "^29.5.0",
+        "pure-rand": "^6.0.0",
         "slash": "^3.0.0",
         "stack-utils": "^2.0.3"
       }
     },
     "jest-cli": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz",
-      "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz",
+      "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==",
       "dev": true,
       "requires": {
-        "@jest/core": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/core": "^29.5.0",
+        "@jest/test-result": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "chalk": "^4.0.0",
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
         "import-local": "^3.0.2",
-        "jest-config": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
+        "jest-config": "^29.5.0",
+        "jest-util": "^29.5.0",
+        "jest-validate": "^29.5.0",
         "prompts": "^2.0.1",
         "yargs": "^17.3.1"
       }
     },
     "jest-config": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz",
-      "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz",
+      "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==",
       "dev": true,
       "requires": {
         "@babel/core": "^7.11.6",
-        "@jest/test-sequencer": "^29.3.1",
-        "@jest/types": "^29.3.1",
-        "babel-jest": "^29.3.1",
+        "@jest/test-sequencer": "^29.5.0",
+        "@jest/types": "^29.5.0",
+        "babel-jest": "^29.5.0",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
         "deepmerge": "^4.2.2",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-circus": "^29.3.1",
-        "jest-environment-node": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "jest-regex-util": "^29.2.0",
-        "jest-resolve": "^29.3.1",
-        "jest-runner": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
+        "jest-circus": "^29.5.0",
+        "jest-environment-node": "^29.5.0",
+        "jest-get-type": "^29.4.3",
+        "jest-regex-util": "^29.4.3",
+        "jest-resolve": "^29.5.0",
+        "jest-runner": "^29.5.0",
+        "jest-util": "^29.5.0",
+        "jest-validate": "^29.5.0",
         "micromatch": "^4.0.4",
         "parse-json": "^5.2.0",
-        "pretty-format": "^29.3.1",
+        "pretty-format": "^29.5.0",
         "slash": "^3.0.0",
         "strip-json-comments": "^3.1.1"
       }
     },
     "jest-diff": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz",
-      "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
+      "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
       "dev": true,
       "requires": {
         "chalk": "^4.0.0",
-        "diff-sequences": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
+        "diff-sequences": "^29.4.3",
+        "jest-get-type": "^29.4.3",
+        "pretty-format": "^29.5.0"
       }
     },
     "jest-docblock": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz",
-      "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz",
+      "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==",
       "dev": true,
       "requires": {
         "detect-newline": "^3.0.0"
       }
     },
     "jest-each": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz",
-      "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz",
+      "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==",
       "dev": true,
       "requires": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "chalk": "^4.0.0",
-        "jest-get-type": "^29.2.0",
-        "jest-util": "^29.3.1",
-        "pretty-format": "^29.3.1"
+        "jest-get-type": "^29.4.3",
+        "jest-util": "^29.5.0",
+        "pretty-format": "^29.5.0"
       }
     },
     "jest-environment-node": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz",
-      "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz",
+      "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==",
       "dev": true,
       "requires": {
-        "@jest/environment": "^29.3.1",
-        "@jest/fake-timers": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/environment": "^29.5.0",
+        "@jest/fake-timers": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
-        "jest-mock": "^29.3.1",
-        "jest-util": "^29.3.1"
+        "jest-mock": "^29.5.0",
+        "jest-util": "^29.5.0"
       }
     },
     "jest-get-type": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz",
-      "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
+      "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
       "dev": true
     },
     "jest-haste-map": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz",
-      "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz",
+      "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==",
       "dev": true,
       "requires": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@types/graceful-fs": "^4.1.3",
         "@types/node": "*",
         "anymatch": "^3.0.3",
         "fb-watchman": "^2.0.0",
         "fsevents": "^2.3.2",
         "graceful-fs": "^4.2.9",
-        "jest-regex-util": "^29.2.0",
-        "jest-util": "^29.3.1",
-        "jest-worker": "^29.3.1",
+        "jest-regex-util": "^29.4.3",
+        "jest-util": "^29.5.0",
+        "jest-worker": "^29.5.0",
         "micromatch": "^4.0.4",
         "walker": "^1.0.8"
       }
     },
     "jest-leak-detector": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz",
-      "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz",
+      "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==",
       "dev": true,
       "requires": {
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
+        "jest-get-type": "^29.4.3",
+        "pretty-format": "^29.5.0"
       }
     },
     "jest-matcher-utils": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz",
-      "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz",
+      "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==",
       "dev": true,
       "requires": {
         "chalk": "^4.0.0",
-        "jest-diff": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "pretty-format": "^29.3.1"
+        "jest-diff": "^29.5.0",
+        "jest-get-type": "^29.4.3",
+        "pretty-format": "^29.5.0"
       }
     },
     "jest-message-util": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz",
-      "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz",
+      "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.12.13",
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@types/stack-utils": "^2.0.0",
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
         "micromatch": "^4.0.4",
-        "pretty-format": "^29.3.1",
+        "pretty-format": "^29.5.0",
         "slash": "^3.0.0",
         "stack-utils": "^2.0.3"
       }
     },
     "jest-mock": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz",
-      "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz",
+      "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==",
       "dev": true,
       "requires": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
-        "jest-util": "^29.3.1"
+        "jest-util": "^29.5.0"
       }
     },
     "jest-pnp-resolver": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz",
-      "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==",
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
       "dev": true,
       "requires": {}
     },
     "jest-regex-util": {
-      "version": "29.2.0",
-      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz",
-      "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==",
+      "version": "29.4.3",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz",
+      "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==",
       "dev": true
     },
     "jest-resolve": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz",
-      "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz",
+      "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==",
       "dev": true,
       "requires": {
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.3.1",
+        "jest-haste-map": "^29.5.0",
         "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^29.3.1",
-        "jest-validate": "^29.3.1",
+        "jest-util": "^29.5.0",
+        "jest-validate": "^29.5.0",
         "resolve": "^1.20.0",
-        "resolve.exports": "^1.1.0",
+        "resolve.exports": "^2.0.0",
         "slash": "^3.0.0"
       }
     },
     "jest-resolve-dependencies": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz",
-      "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz",
+      "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==",
       "dev": true,
       "requires": {
-        "jest-regex-util": "^29.2.0",
-        "jest-snapshot": "^29.3.1"
+        "jest-regex-util": "^29.4.3",
+        "jest-snapshot": "^29.5.0"
       }
     },
     "jest-runner": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz",
-      "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz",
+      "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==",
       "dev": true,
       "requires": {
-        "@jest/console": "^29.3.1",
-        "@jest/environment": "^29.3.1",
-        "@jest/test-result": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/console": "^29.5.0",
+        "@jest/environment": "^29.5.0",
+        "@jest/test-result": "^29.5.0",
+        "@jest/transform": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
         "graceful-fs": "^4.2.9",
-        "jest-docblock": "^29.2.0",
-        "jest-environment-node": "^29.3.1",
-        "jest-haste-map": "^29.3.1",
-        "jest-leak-detector": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-resolve": "^29.3.1",
-        "jest-runtime": "^29.3.1",
-        "jest-util": "^29.3.1",
-        "jest-watcher": "^29.3.1",
-        "jest-worker": "^29.3.1",
+        "jest-docblock": "^29.4.3",
+        "jest-environment-node": "^29.5.0",
+        "jest-haste-map": "^29.5.0",
+        "jest-leak-detector": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-resolve": "^29.5.0",
+        "jest-runtime": "^29.5.0",
+        "jest-util": "^29.5.0",
+        "jest-watcher": "^29.5.0",
+        "jest-worker": "^29.5.0",
         "p-limit": "^3.1.0",
         "source-map-support": "0.5.13"
       }
     },
     "jest-runtime": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz",
-      "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^29.3.1",
-        "@jest/fake-timers": "^29.3.1",
-        "@jest/globals": "^29.3.1",
-        "@jest/source-map": "^29.2.0",
-        "@jest/test-result": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz",
+      "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==",
+      "dev": true,
+      "requires": {
+        "@jest/environment": "^29.5.0",
+        "@jest/fake-timers": "^29.5.0",
+        "@jest/globals": "^29.5.0",
+        "@jest/source-map": "^29.4.3",
+        "@jest/test-result": "^29.5.0",
+        "@jest/transform": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "cjs-module-lexer": "^1.0.0",
         "collect-v8-coverage": "^1.0.0",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-mock": "^29.3.1",
-        "jest-regex-util": "^29.2.0",
-        "jest-resolve": "^29.3.1",
-        "jest-snapshot": "^29.3.1",
-        "jest-util": "^29.3.1",
+        "jest-haste-map": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-mock": "^29.5.0",
+        "jest-regex-util": "^29.4.3",
+        "jest-resolve": "^29.5.0",
+        "jest-snapshot": "^29.5.0",
+        "jest-util": "^29.5.0",
         "slash": "^3.0.0",
         "strip-bom": "^4.0.0"
       }
     },
     "jest-snapshot": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz",
-      "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz",
+      "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==",
       "dev": true,
       "requires": {
         "@babel/core": "^7.11.6",
@@ -15030,33 +15087,32 @@
         "@babel/plugin-syntax-typescript": "^7.7.2",
         "@babel/traverse": "^7.7.2",
         "@babel/types": "^7.3.3",
-        "@jest/expect-utils": "^29.3.1",
-        "@jest/transform": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/expect-utils": "^29.5.0",
+        "@jest/transform": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/babel__traverse": "^7.0.6",
         "@types/prettier": "^2.1.5",
         "babel-preset-current-node-syntax": "^1.0.0",
         "chalk": "^4.0.0",
-        "expect": "^29.3.1",
+        "expect": "^29.5.0",
         "graceful-fs": "^4.2.9",
-        "jest-diff": "^29.3.1",
-        "jest-get-type": "^29.2.0",
-        "jest-haste-map": "^29.3.1",
-        "jest-matcher-utils": "^29.3.1",
-        "jest-message-util": "^29.3.1",
-        "jest-util": "^29.3.1",
+        "jest-diff": "^29.5.0",
+        "jest-get-type": "^29.4.3",
+        "jest-matcher-utils": "^29.5.0",
+        "jest-message-util": "^29.5.0",
+        "jest-util": "^29.5.0",
         "natural-compare": "^1.4.0",
-        "pretty-format": "^29.3.1",
+        "pretty-format": "^29.5.0",
         "semver": "^7.3.5"
       }
     },
     "jest-util": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz",
-      "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
+      "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==",
       "dev": true,
       "requires": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
@@ -15065,17 +15121,17 @@
       }
     },
     "jest-validate": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz",
-      "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz",
+      "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==",
       "dev": true,
       "requires": {
-        "@jest/types": "^29.3.1",
+        "@jest/types": "^29.5.0",
         "camelcase": "^6.2.0",
         "chalk": "^4.0.0",
-        "jest-get-type": "^29.2.0",
+        "jest-get-type": "^29.4.3",
         "leven": "^3.1.0",
-        "pretty-format": "^29.3.1"
+        "pretty-format": "^29.5.0"
       },
       "dependencies": {
         "camelcase": {
@@ -15087,29 +15143,29 @@
       }
     },
     "jest-watcher": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz",
-      "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz",
+      "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==",
       "dev": true,
       "requires": {
-        "@jest/test-result": "^29.3.1",
-        "@jest/types": "^29.3.1",
+        "@jest/test-result": "^29.5.0",
+        "@jest/types": "^29.5.0",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
-        "jest-util": "^29.3.1",
+        "jest-util": "^29.5.0",
         "string-length": "^4.0.1"
       }
     },
     "jest-worker": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz",
-      "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz",
+      "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==",
       "dev": true,
       "requires": {
         "@types/node": "*",
-        "jest-util": "^29.3.1",
+        "jest-util": "^29.5.0",
         "merge-stream": "^2.0.0",
         "supports-color": "^8.0.0"
       },
@@ -15864,9 +15920,9 @@
       "dev": true
     },
     "node-releases": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
-      "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
+      "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
       "dev": true
     },
     "nodegit-promise": {
@@ -16251,12 +16307,12 @@
       "dev": true
     },
     "pretty-format": {
-      "version": "29.3.1",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz",
-      "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==",
+      "version": "29.5.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
+      "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
       "dev": true,
       "requires": {
-        "@jest/schemas": "^29.0.0",
+        "@jest/schemas": "^29.4.3",
         "ansi-styles": "^5.0.0",
         "react-is": "^18.0.0"
       },
@@ -16381,6 +16437,12 @@
         }
       }
     },
+    "pure-rand": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz",
+      "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==",
+      "dev": true
+    },
     "purgecss": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-5.0.0.tgz",
@@ -16674,9 +16736,9 @@
       "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
     },
     "resolve.exports": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
-      "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz",
+      "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==",
       "dev": true
     },
     "responselike": {
@@ -17581,9 +17643,9 @@
       "optional": true
     },
     "v8-to-istanbul": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz",
-      "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==",
+      "version": "9.1.0",
+      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
+      "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
       "dev": true,
       "requires": {
         "@jridgewell/trace-mapping": "^0.3.12",
@@ -17803,9 +17865,9 @@
       "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
     },
     "yargs": {
-      "version": "17.6.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz",
-      "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==",
+      "version": "17.7.1",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
+      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
       "dev": true,
       "requires": {
         "cliui": "^8.0.1",
diff --git a/package.json b/package.json
index 2b128f9b4c9..69b3e74e94e 100644
--- a/package.json
+++ b/package.json
@@ -70,7 +70,7 @@
   },
   "devDependencies": {
     "eslint": "^8.35.0",
-    "jest": "^29.3.1",
+    "jest": "^29.5.0",
     "libxmljs2": "^0.31.0"
   },
   "jest": {

From fcd18edd5ca5053d10705e58592f06aff227766e Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Sun, 12 Mar 2023 22:43:25 -0400
Subject: [PATCH 079/196] chore(deps): bump @primer/octicons from 18.0.0 to
 18.2.0 (#1399) [skip ci]

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 891d2871918..e526af02ae3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,7 @@
         "@octokit/graphql": "^5.0.4",
         "@octokit/rest": "^19.0.5",
         "@primer/css": "^20.8.0",
-        "@primer/octicons": "^18.0.0",
+        "@primer/octicons": "^18.2.0",
         "@twemoji/parser": "^14.1.0",
         "axios": "^1.2.2",
         "clipboard": "^2.0.11",
@@ -2008,9 +2008,9 @@
       }
     },
     "node_modules/@primer/octicons": {
-      "version": "18.0.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-18.0.0.tgz",
-      "integrity": "sha512-EC2T95Xl9FCt84pVROjGmwfBvDWxnvWxL+RGsWYNxr1qY7UO58WgLScgi7K8p4gSK5V/k9vHi/k1EhunIyRGRw==",
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-18.2.0.tgz",
+      "integrity": "sha512-Bx7PkGZUgbo/xbZSdufxKefg5JzvGPkIu/x93TAiWit+FoPBmLammqfHQe1Y5gmT2AWAuxJUksYN05hi7w6VnA==",
       "dependencies": {
         "object-assign": "^4.1.1"
       }
@@ -11748,9 +11748,9 @@
       }
     },
     "@primer/octicons": {
-      "version": "18.0.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-18.0.0.tgz",
-      "integrity": "sha512-EC2T95Xl9FCt84pVROjGmwfBvDWxnvWxL+RGsWYNxr1qY7UO58WgLScgi7K8p4gSK5V/k9vHi/k1EhunIyRGRw==",
+      "version": "18.2.0",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-18.2.0.tgz",
+      "integrity": "sha512-Bx7PkGZUgbo/xbZSdufxKefg5JzvGPkIu/x93TAiWit+FoPBmLammqfHQe1Y5gmT2AWAuxJUksYN05hi7w6VnA==",
       "requires": {
         "object-assign": "^4.1.1"
       }
diff --git a/package.json b/package.json
index 69b3e74e94e..02c369966df 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
     "@octokit/graphql": "^5.0.4",
     "@octokit/rest": "^19.0.5",
     "@primer/css": "^20.8.0",
-    "@primer/octicons": "^18.0.0",
+    "@primer/octicons": "^18.2.0",
     "@twemoji/parser": "^14.1.0",
     "axios": "^1.2.2",
     "clipboard": "^2.0.11",

From f4c6742cd139ff37118dcc790ce1446c6fa7e4ce Mon Sep 17 00:00:00 2001
From: Solomon <108384593+RJid@users.noreply.github.com>
Date: Mon, 13 Mar 2023 03:47:39 +0100
Subject: [PATCH 080/196] chore(deps): bump minimatch from 6.0.4 to 6.1.6
 (#1389) [skip ci]

---
 package-lock.json | 14 +++++++-------
 package.json      |  2 +-
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e526af02ae3..63a9a8af747 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -33,7 +33,7 @@
         "linguist-js": "^2.5.4",
         "marked": "^4.2.12",
         "memory-cache": "^0.2.0",
-        "minimatch": "^6.0.4",
+        "minimatch": "^6.1.6",
         "node-fetch": "^3.3.0",
         "open-graph-scraper": "^5.0.3",
         "png-js": "^1.0.0",
@@ -7219,9 +7219,9 @@
       }
     },
     "node_modules/minimatch": {
-      "version": "6.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.0.4.tgz",
-      "integrity": "sha512-9SQupyyavjdAc1VFjJS/5kdtFtlLAhKSWt7HocG0h/npy626jYrGegSslcM7Xxet5z0U9GOx9YbcpyIjBzn7tA==",
+      "version": "6.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.1.6.tgz",
+      "integrity": "sha512-6bR3UIeh/DF8+p6A9Spyuy67ShOq42rOkHWi7eUe3Ua99Zo5lZfGC6lJJWkeoK4k9jQFT3Pl7czhTXimG2XheA==",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -15670,9 +15670,9 @@
       "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="
     },
     "minimatch": {
-      "version": "6.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.0.4.tgz",
-      "integrity": "sha512-9SQupyyavjdAc1VFjJS/5kdtFtlLAhKSWt7HocG0h/npy626jYrGegSslcM7Xxet5z0U9GOx9YbcpyIjBzn7tA==",
+      "version": "6.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.1.6.tgz",
+      "integrity": "sha512-6bR3UIeh/DF8+p6A9Spyuy67ShOq42rOkHWi7eUe3Ua99Zo5lZfGC6lJJWkeoK4k9jQFT3Pl7czhTXimG2XheA==",
       "requires": {
         "brace-expansion": "^2.0.1"
       }
diff --git a/package.json b/package.json
index 02c369966df..886f4a7f1e5 100644
--- a/package.json
+++ b/package.json
@@ -52,7 +52,7 @@
     "linguist-js": "^2.5.4",
     "marked": "^4.2.12",
     "memory-cache": "^0.2.0",
-    "minimatch": "^6.0.4",
+    "minimatch": "^6.1.6",
     "node-fetch": "^3.3.0",
     "open-graph-scraper": "^5.0.3",
     "png-js": "^1.0.0",

From e2bf05a5d39d6a0b1caf714e4ed637b4337c7fb0 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 12 Mar 2023 23:12:33 -0400
Subject: [PATCH 081/196] fix(ci): missing cache path

---
 .github/workflows/ci.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index b0160e6495e..6ac9e634d11 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -27,6 +27,7 @@ jobs:
         run: |
           curl -fsSL https://dprint.dev/install.sh | sh
           cp /home/runner/.dprint/bin/dprint /usr/local/bin/dprint
+          mkdir -p /home/runner/.cache/dprint/cache
           npm install -g eslint
       - name: Checkout master
         run: git checkout master

From f5244e9bce1a52c5b59cd738358b05ceed867bf8 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 12 Mar 2023 23:18:20 -0400
Subject: [PATCH 082/196] fix: ci

---
 .github/workflows/ci.yml | 2 --
 1 file changed, 2 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 6ac9e634d11..ecdb9d3a020 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -27,8 +27,6 @@ jobs:
         run: |
           curl -fsSL https://dprint.dev/install.sh | sh
           cp /home/runner/.dprint/bin/dprint /usr/local/bin/dprint
-          mkdir -p /home/runner/.cache/dprint/cache
-          npm install -g eslint
       - name: Checkout master
         run: git checkout master
       - name: Format code

From 22d42118499a4b87487ba5cd2ed93fd7fe9235bb Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 12 Mar 2023 23:20:54 -0400
Subject: [PATCH 083/196] fix: ci

---
 .github/workflows/test.yml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index f86a4938a00..d73663ada4f 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -41,7 +41,6 @@ jobs:
         run: |
           curl -fsSL https://dprint.dev/install.sh | sh
           cp /home/runner/.dprint/bin/dprint /usr/local/bin/dprint
-          npm install -g eslint
           dprint fmt --config .github/config/dprint.json
       - name: Build lowlighter/metrics:${{ github.head_ref || 'master' }}
         run: docker build -t lowlighter/metrics:$(echo ${{ github.head_ref || 'master' }} | sed 's/\//-/g') .

From 2cb466af6dbf47248206e6e6bb529663ab1641bb Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 12 Mar 2023 23:50:53 -0400
Subject: [PATCH 084/196] chore(deps): upgrade dependencies

---
 package-lock.json | 11251 +++++++-------------------------------------
 package.json      |    38 +-
 2 files changed, 1835 insertions(+), 9454 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 63a9a8af747..134354811b3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,7 +1,7 @@
 {
   "name": "metrics",
   "version": "3.33.0-beta",
-  "lockfileVersion": 2,
+  "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
@@ -13,50 +13,50 @@
         "@actions/core": "^1.10.0",
         "@actions/github": "^5.1.1",
         "@faker-js/faker": "^7.6.0",
-        "@octokit/graphql": "^5.0.4",
-        "@octokit/rest": "^19.0.5",
-        "@primer/css": "^20.8.0",
+        "@octokit/graphql": "^5.0.5",
+        "@octokit/rest": "^19.0.7",
+        "@primer/css": "^20.8.3",
         "@primer/octicons": "^18.2.0",
         "@twemoji/parser": "^14.1.0",
-        "axios": "^1.2.2",
+        "axios": "^1.3.4",
         "clipboard": "^2.0.11",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
-        "d3": "^7.8.1",
-        "ejs": "^3.1.8",
+        "d3": "^7.8.2",
+        "ejs": "^3.1.9",
         "emoji-name-map": "^1.2.9",
         "express": "^4.18.2",
         "express-rate-limit": "^6.7.0",
-        "file-type": "^18.2.0",
+        "file-type": "^18.2.1",
         "js-yaml": "^4.1.0",
-        "jsdom": "^21.0.0",
+        "jsdom": "^21.1.1",
         "linguist-js": "^2.5.4",
         "marked": "^4.2.12",
         "memory-cache": "^0.2.0",
-        "minimatch": "^6.1.6",
-        "node-fetch": "^3.3.0",
-        "open-graph-scraper": "^5.0.3",
+        "minimatch": "^7.4.2",
+        "node-fetch": "^3.3.1",
+        "open-graph-scraper": "^5.1.1",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^19.5.2",
+        "puppeteer": "^19.7.4",
         "purgecss": "^5.0.0",
         "rss-parser": "^3.12.0",
-        "sanitize-html": "^2.8.1",
+        "sanitize-html": "^2.10.0",
         "sharp": "^0.31.3",
-        "simple-git": "^3.16.0",
+        "simple-git": "^3.17.0",
         "svgo": "^3.0.2",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
-        "xml-formatter": "^3.2.0"
+        "xml-formatter": "^3.3.2"
       },
       "devDependencies": {
+        "dprint": "^0.35.1",
         "eslint": "^8.35.0",
-        "jest": "^29.5.0",
-        "libxmljs2": "^0.31.0"
+        "jest": "^29.5.0"
       },
       "optionalDependencies": {
-        "@googlemaps/google-maps-services-js": "^3.3.26",
-        "chess.js": "^1.0.0-beta.1",
+        "@googlemaps/google-maps-services-js": "^3.3.27",
+        "chess.js": "^1.0.0-beta.3",
         "color": "^4.2.3",
         "gifencoder": "^2.0.1",
         "libxmljs2": "^0.31.0",
@@ -74,14 +74,6 @@
         "uuid": "^8.3.2"
       }
     },
-    "node_modules/@actions/core/node_modules/uuid": {
-      "version": "8.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
-      "bin": {
-        "uuid": "dist/bin/uuid"
-      }
-    },
     "node_modules/@actions/github": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz",
@@ -94,9 +86,9 @@
       }
     },
     "node_modules/@actions/http-client": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
-      "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.1.0.tgz",
+      "integrity": "sha512-BonhODnXr3amchh4qkmjPMUO8mFi/zLaaCeCAJZqch8iQqyDnVIkySjB38VHAC8IJ+bnlgfOqlhpyCUZHlQsqw==",
       "dependencies": {
         "tunnel": "^0.0.6"
       }
@@ -164,38 +156,12 @@
         "url": "https://opencollective.com/babel"
       }
     },
-    "node_modules/@babel/core/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@babel/core/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+    "node_modules/@babel/core/node_modules/convert-source-map": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
       "dev": true
     },
-    "node_modules/@babel/core/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
     "node_modules/@babel/generator": {
       "version": "7.21.1",
       "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz",
@@ -244,30 +210,6 @@
         "@babel/core": "^7.0.0"
       }
     },
-    "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^3.0.2"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-      "dev": true
-    },
     "node_modules/@babel/helper-environment-visitor": {
       "version": "7.18.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
@@ -706,23 +648,6 @@
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/traverse/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/@babel/traverse/node_modules/globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -732,12 +657,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/@babel/traverse/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
     "node_modules/@babel/types": {
       "version": "7.21.2",
       "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz",
@@ -758,15 +677,39 @@
       "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
       "dev": true
     },
+    "node_modules/@eslint-community/eslint-utils": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz",
+      "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==",
+      "dev": true,
+      "dependencies": {
+        "eslint-visitor-keys": "^3.3.0"
+      },
+      "engines": {
+        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "peerDependencies": {
+        "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+      }
+    },
+    "node_modules/@eslint-community/regexpp": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz",
+      "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==",
+      "dev": true,
+      "engines": {
+        "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+      }
+    },
     "node_modules/@eslint/eslintrc": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz",
-      "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
+      "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
-        "espree": "^9.4.0",
+        "espree": "^9.5.0",
         "globals": "^13.19.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
@@ -791,23 +734,6 @@
         "concat-map": "0.0.1"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/@eslint/eslintrc/node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -820,16 +746,10 @@
         "node": "*"
       }
     },
-    "node_modules/@eslint/eslintrc/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
     "node_modules/@eslint/js": {
-      "version": "8.35.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz",
-      "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
+      "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -876,9 +796,9 @@
       "integrity": "sha512-L6CMrcA5we0udafvoSuRCE/Ci/3xrLWKYRGup2IlhxF771bQYsQ2EB1of182pI8ZWM4oxgwzu37+igMeoZjN/A=="
     },
     "node_modules/@github/combobox-nav": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.1.5.tgz",
-      "integrity": "sha512-dmG1PuppNKHnBBEcfylWDwj9SSxd/E/qd8mC1G/klQC3s7ps5q6JZ034mwkkG0LKfI+Y+UgEua/ROD776N400w=="
+      "version": "2.1.7",
+      "resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.1.7.tgz",
+      "integrity": "sha512-Webx0W5iTpkk5Chy9dB/1BEUORQ0qrwui8HaaVBiy75W2VOJg96WTuKj1rXENAJ3XTMhdEF53bn0LYfvP0EKvg=="
     },
     "node_modules/@github/details-menu-element": {
       "version": "1.0.13",
@@ -896,9 +816,9 @@
       "integrity": "sha512-iEeR2OdVCPkdIPUszL8gJnKNu4MR8ANh7y0u/LPyaatYezgaWxUZEzhFntloqQq+HE6MZkFy+cl+xzCNuljOdw=="
     },
     "node_modules/@github/relative-time-element": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.1.5.tgz",
-      "integrity": "sha512-WAf1EQV5Sn6jGuAIQur/ztKlEV9R+VHDNwqEbeaOb6s9fiwM5z7+ujlWNZtgFkDp3lF0H8D/f0vdiPlfHz0ZTQ=="
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.2.3.tgz",
+      "integrity": "sha512-M5NaacbpSmKUk6tYQ8r/LokSHeIb6D7rTTOqZ/htQX3b7KGKiDXI0t/WF7UDy58Go0NNfEahE9WzGEKcSjqfrA=="
     },
     "node_modules/@github/tab-container-element": {
       "version": "3.2.0",
@@ -906,9 +826,9 @@
       "integrity": "sha512-to5ZJuywKK3KX53X1ifOcWjvUTQcBGdQ6Qkhm8L97xQ3ovICag1048M3YMpc+QSdr8xWeCBMnLeMnENqotB0Og=="
     },
     "node_modules/@googlemaps/google-maps-services-js": {
-      "version": "3.3.26",
-      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.26.tgz",
-      "integrity": "sha512-/t0J/vLxPJcFsygSJU50WHgz2R3noAr7SkicthukD1HaEpMQ/O+llYt80R5yoO5cV9vMMDSqGUO7TvIEqiy3Ig==",
+      "version": "3.3.27",
+      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.27.tgz",
+      "integrity": "sha512-0MDcoqiLMzu4xPExrcm17fx89ZH5RgCg4J3pBokJURCzmF1XAIqNGO5zipcXl5QZOp+zhcrqC3Rl2k7rdd9p/Q==",
       "optional": true,
       "dependencies": {
         "@googlemaps/url-signature": "^1.0.4",
@@ -929,9 +849,9 @@
       }
     },
     "node_modules/@googlemaps/url-signature": {
-      "version": "1.0.25",
-      "resolved": "https://registry.npmjs.org/@googlemaps/url-signature/-/url-signature-1.0.25.tgz",
-      "integrity": "sha512-gc91DO9GRrcOdlKRes42+bMb45TuDxAEPrdARClCuGkkdWyb2dG/x+9fs63FTFf0Y26Q+bDNcQLID+TA37vn8Q==",
+      "version": "1.0.29",
+      "resolved": "https://registry.npmjs.org/@googlemaps/url-signature/-/url-signature-1.0.29.tgz",
+      "integrity": "sha512-EKcL5ki6gUC02Yyrru8l37YKTNvfpoE/gMHy+tHoXjw2UuRBwGcXyMoHonGDUE9HNJrR7kXeG89ex4oGyX0NGQ==",
       "optional": true,
       "dependencies": {
         "crypto-js": "^4.1.1"
@@ -961,23 +881,6 @@
         "concat-map": "0.0.1"
       }
     },
-    "node_modules/@humanwhocodes/config-array/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -990,12 +893,6 @@
         "node": "*"
       }
     },
-    "node_modules/@humanwhocodes/config-array/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
     "node_modules/@humanwhocodes/module-importer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -1040,6 +937,19 @@
         "sprintf-js": "~1.0.2"
       }
     },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dev": true,
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
       "version": "3.14.1",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -1053,6 +963,45 @@
         "js-yaml": "bin/js-yaml.js"
       }
     },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
     "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -1338,12 +1287,6 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/@jest/transform/node_modules/convert-source-map": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
-      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
-      "dev": true
-    },
     "node_modules/@jest/types": {
       "version": "29.5.0",
       "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz",
@@ -1416,27 +1359,6 @@
         "debug": "^4.1.1"
       }
     },
-    "node_modules/@kwsites/file-exists/node_modules/debug": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@kwsites/file-exists/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
     "node_modules/@kwsites/promise-deferred": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
@@ -1446,7 +1368,7 @@
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz",
       "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==",
-      "devOptional": true,
+      "optional": true,
       "dependencies": {
         "detect-libc": "^2.0.0",
         "https-proxy-agent": "^5.0.0",
@@ -1462,11 +1384,23 @@
         "node-pre-gyp": "bin/node-pre-gyp"
       }
     },
+    "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "optional": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": {
-      "version": "2.6.7",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-      "devOptional": true,
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
+      "optional": true,
       "dependencies": {
         "whatwg-url": "^5.0.0"
       },
@@ -1482,22 +1416,49 @@
         }
       }
     },
+    "node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
+      "version": "7.3.8",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "optional": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@mapbox/node-pre-gyp/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+      "optional": true
+    },
     "node_modules/@mapbox/node-pre-gyp/node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
-      "devOptional": true
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+      "optional": true
     },
     "node_modules/@mapbox/node-pre-gyp/node_modules/whatwg-url": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
-      "devOptional": true,
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "optional": true,
       "dependencies": {
         "tr46": "~0.0.3",
         "webidl-conversions": "^3.0.0"
       }
     },
+    "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "optional": true
+    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -1534,9 +1495,9 @@
       }
     },
     "node_modules/@octokit/auth-token": {
-      "version": "2.4.5",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz",
-      "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==",
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
+      "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
       "dependencies": {
         "@octokit/types": "^6.0.3"
       }
@@ -1576,12 +1537,12 @@
       }
     },
     "node_modules/@octokit/graphql": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz",
-      "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==",
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz",
+      "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==",
       "dependencies": {
         "@octokit/request": "^6.0.0",
-        "@octokit/types": "^8.0.0",
+        "@octokit/types": "^9.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
@@ -1589,11 +1550,11 @@
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/endpoint": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.0.tgz",
-      "integrity": "sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ==",
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz",
+      "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==",
       "dependencies": {
-        "@octokit/types": "^6.0.3",
+        "@octokit/types": "^9.0.0",
         "is-plain-object": "^5.0.0",
         "universal-user-agent": "^6.0.0"
       },
@@ -1601,32 +1562,19 @@
         "node": ">= 14"
       }
     },
-    "node_modules/@octokit/graphql/node_modules/@octokit/endpoint/node_modules/@octokit/openapi-types": {
-      "version": "12.11.0",
-      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
-      "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
-    },
-    "node_modules/@octokit/graphql/node_modules/@octokit/endpoint/node_modules/@octokit/types": {
-      "version": "6.41.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
-      "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
-      "dependencies": {
-        "@octokit/openapi-types": "^12.11.0"
-      }
-    },
     "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": {
-      "version": "14.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz",
-      "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw=="
+      "version": "16.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz",
+      "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA=="
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/request": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.1.0.tgz",
-      "integrity": "sha512-36V+sP4bJli31TRq8sea3d/Q1XGgZ9cnqpsegkLCnvpu+hoYephSkxGlWg4KB6dyUM1IWPXVrLFOKYzObQ+MZg==",
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz",
+      "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==",
       "dependencies": {
         "@octokit/endpoint": "^7.0.0",
         "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^6.16.1",
+        "@octokit/types": "^9.0.0",
         "is-plain-object": "^5.0.0",
         "node-fetch": "^2.6.7",
         "universal-user-agent": "^6.0.0"
@@ -1636,11 +1584,11 @@
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/request-error": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.0.tgz",
-      "integrity": "sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
+      "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
       "dependencies": {
-        "@octokit/types": "^6.0.3",
+        "@octokit/types": "^9.0.0",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       },
@@ -1648,44 +1596,18 @@
         "node": ">= 14"
       }
     },
-    "node_modules/@octokit/graphql/node_modules/@octokit/request-error/node_modules/@octokit/openapi-types": {
-      "version": "12.11.0",
-      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
-      "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
-    },
-    "node_modules/@octokit/graphql/node_modules/@octokit/request-error/node_modules/@octokit/types": {
-      "version": "6.41.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
-      "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
-      "dependencies": {
-        "@octokit/openapi-types": "^12.11.0"
-      }
-    },
-    "node_modules/@octokit/graphql/node_modules/@octokit/request/node_modules/@octokit/openapi-types": {
-      "version": "12.11.0",
-      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
-      "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
-    },
-    "node_modules/@octokit/graphql/node_modules/@octokit/request/node_modules/@octokit/types": {
-      "version": "6.41.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
-      "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
-      "dependencies": {
-        "@octokit/openapi-types": "^12.11.0"
-      }
-    },
     "node_modules/@octokit/graphql/node_modules/@octokit/types": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.0.0.tgz",
-      "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz",
+      "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==",
       "dependencies": {
-        "@octokit/openapi-types": "^14.0.0"
+        "@octokit/openapi-types": "^16.0.0"
       }
     },
     "node_modules/@octokit/graphql/node_modules/node-fetch": {
-      "version": "2.6.7",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
       "dependencies": {
         "whatwg-url": "^5.0.0"
       },
@@ -1701,6 +1623,11 @@
         }
       }
     },
+    "node_modules/@octokit/graphql/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
     "node_modules/@octokit/graphql/node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -1716,16 +1643,16 @@
       }
     },
     "node_modules/@octokit/openapi-types": {
-      "version": "12.8.0",
-      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.8.0.tgz",
-      "integrity": "sha512-ydcKLs2KKcxlhpdWLzJxEBDEk/U5MUeqtqkXlrtAUXXFPs6vLl1PEGghFC/BbpleosB7iXs0Z4P2DGe7ZT5ZNg=="
+      "version": "12.11.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+      "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
     },
     "node_modules/@octokit/plugin-paginate-rest": {
-      "version": "2.17.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz",
-      "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==",
+      "version": "2.21.3",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
+      "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
       "dependencies": {
-        "@octokit/types": "^6.34.0"
+        "@octokit/types": "^6.40.0"
       },
       "peerDependencies": {
         "@octokit/core": ">=2"
@@ -1740,11 +1667,11 @@
       }
     },
     "node_modules/@octokit/plugin-rest-endpoint-methods": {
-      "version": "5.13.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz",
-      "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==",
+      "version": "5.16.2",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
+      "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
       "dependencies": {
-        "@octokit/types": "^6.34.0",
+        "@octokit/types": "^6.39.0",
         "deprecation": "^2.3.1"
       },
       "peerDependencies": {
@@ -1775,9 +1702,9 @@
       }
     },
     "node_modules/@octokit/request/node_modules/node-fetch": {
-      "version": "2.6.7",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
       "dependencies": {
         "whatwg-url": "^5.0.0"
       },
@@ -1793,55 +1720,60 @@
         }
       }
     },
+    "node_modules/@octokit/request/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
     "node_modules/@octokit/request/node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
     },
     "node_modules/@octokit/request/node_modules/whatwg-url": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
       "dependencies": {
         "tr46": "~0.0.3",
         "webidl-conversions": "^3.0.0"
       }
     },
     "node_modules/@octokit/rest": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz",
-      "integrity": "sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==",
+      "version": "19.0.7",
+      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz",
+      "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==",
       "dependencies": {
         "@octokit/core": "^4.1.0",
-        "@octokit/plugin-paginate-rest": "^5.0.0",
+        "@octokit/plugin-paginate-rest": "^6.0.0",
         "@octokit/plugin-request-log": "^1.0.4",
-        "@octokit/plugin-rest-endpoint-methods": "^6.7.0"
+        "@octokit/plugin-rest-endpoint-methods": "^7.0.0"
       },
       "engines": {
         "node": ">= 14"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/auth-token": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz",
-      "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz",
+      "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==",
       "dependencies": {
-        "@octokit/types": "^8.0.0"
+        "@octokit/types": "^9.0.0"
       },
       "engines": {
         "node": ">= 14"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/core": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz",
-      "integrity": "sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==",
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz",
+      "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==",
       "dependencies": {
         "@octokit/auth-token": "^3.0.0",
         "@octokit/graphql": "^5.0.0",
         "@octokit/request": "^6.0.0",
         "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^8.0.0",
+        "@octokit/types": "^9.0.0",
         "before-after-hook": "^2.2.0",
         "universal-user-agent": "^6.0.0"
       },
@@ -1850,11 +1782,11 @@
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/endpoint": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz",
-      "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==",
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz",
+      "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==",
       "dependencies": {
-        "@octokit/types": "^8.0.0",
+        "@octokit/types": "^9.0.0",
         "is-plain-object": "^5.0.0",
         "universal-user-agent": "^6.0.0"
       },
@@ -1863,16 +1795,16 @@
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": {
-      "version": "14.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz",
-      "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw=="
+      "version": "16.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz",
+      "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA=="
     },
     "node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz",
-      "integrity": "sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz",
+      "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==",
       "dependencies": {
-        "@octokit/types": "^8.0.0"
+        "@octokit/types": "^9.0.0"
       },
       "engines": {
         "node": ">= 14"
@@ -1882,11 +1814,11 @@
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz",
-      "integrity": "sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz",
+      "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==",
       "dependencies": {
-        "@octokit/types": "^8.0.0",
+        "@octokit/types": "^9.0.0",
         "deprecation": "^2.3.1"
       },
       "engines": {
@@ -1897,13 +1829,13 @@
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/request": {
-      "version": "6.2.2",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz",
-      "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==",
+      "version": "6.2.3",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz",
+      "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==",
       "dependencies": {
         "@octokit/endpoint": "^7.0.0",
         "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^8.0.0",
+        "@octokit/types": "^9.0.0",
         "is-plain-object": "^5.0.0",
         "node-fetch": "^2.6.7",
         "universal-user-agent": "^6.0.0"
@@ -1913,11 +1845,11 @@
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/request-error": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz",
-      "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
+      "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
       "dependencies": {
-        "@octokit/types": "^8.0.0",
+        "@octokit/types": "^9.0.0",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       },
@@ -1926,17 +1858,17 @@
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/types": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.0.0.tgz",
-      "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz",
+      "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==",
       "dependencies": {
-        "@octokit/openapi-types": "^14.0.0"
+        "@octokit/openapi-types": "^16.0.0"
       }
     },
     "node_modules/@octokit/rest/node_modules/node-fetch": {
-      "version": "2.6.7",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
+      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
       "dependencies": {
         "whatwg-url": "^5.0.0"
       },
@@ -1952,6 +1884,11 @@
         }
       }
     },
+    "node_modules/@octokit/rest/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
     "node_modules/@octokit/rest/node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -1967,11 +1904,11 @@
       }
     },
     "node_modules/@octokit/types": {
-      "version": "6.39.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.39.0.tgz",
-      "integrity": "sha512-Mq4N9sOAYCitTsBtDdRVrBE80lIrMBhL9Jbrw0d+j96BAzlq4V+GLHFJbHokEsVvO/9tQupQdoFdgVYhD2C8UQ==",
+      "version": "6.41.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+      "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
       "dependencies": {
-        "@octokit/openapi-types": "^12.7.0"
+        "@octokit/openapi-types": "^12.11.0"
       }
     },
     "node_modules/@panosoft/ramda-utils": {
@@ -1991,17 +1928,17 @@
       "optional": true
     },
     "node_modules/@primer/behaviors": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.1.tgz",
-      "integrity": "sha512-aMRDUQ350lk0FxtL5gJWPFHHOSSzDbJ6uNJVIt8XSqiGe1pxuW5mVVfrEp1uvzZ0pCHkCdm9fycjnfOeMeIrOQ=="
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.3.tgz",
+      "integrity": "sha512-iHMRuu8YWDJIdqCi1krx0cyFNeqszNKTOb0dXFu2wQ5BeIqxqPJLD7rjZ2Vjf/+YaPSbWuIQE1H6TaGMMsDfdA=="
     },
     "node_modules/@primer/css": {
-      "version": "20.8.0",
-      "resolved": "https://registry.npmjs.org/@primer/css/-/css-20.8.0.tgz",
-      "integrity": "sha512-ybrROX5Qaurqidl4QlSC7AwZ1fTKODlQQDkncOXzHoFM0xe2aMH4zvGXz79Cz2W1sdJ4kpa8dsGqfkkcXbjalQ==",
+      "version": "20.8.3",
+      "resolved": "https://registry.npmjs.org/@primer/css/-/css-20.8.3.tgz",
+      "integrity": "sha512-jXF6l3Cjks6PkWTKbSkrg2h/pE+w/HVXZCpDkLcZB3P1d1cAaK8LXeVVBVWSjnKWIMfiNzyHcx1CTUtj5T4Ivg==",
       "dependencies": {
-        "@primer/primitives": "^7.9.0",
-        "@primer/view-components": "^0.0.115"
+        "@primer/primitives": "^7.11.1",
+        "@primer/view-components": "^0.0.120"
       },
       "engines": {
         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
@@ -2016,14 +1953,14 @@
       }
     },
     "node_modules/@primer/primitives": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.9.0.tgz",
-      "integrity": "sha512-ZHHfwB0z0z6nDJp263gyGIClYDy+rl0nwqyi4qhcv3Cxhkmtf+If2KVjr6FQqBBFfi1wQwUzaax2FBvfEMFBnw=="
+      "version": "7.11.1",
+      "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.11.1.tgz",
+      "integrity": "sha512-Sdss4XG96nqBqrTAyg+RuFOj+U5wkICK8n2hafcyT+lpSlZoIwcbmhyFjmDy9f88FkhHe2q0uCpQ8PjKd8ILTQ=="
     },
     "node_modules/@primer/view-components": {
-      "version": "0.0.115",
-      "resolved": "https://registry.npmjs.org/@primer/view-components/-/view-components-0.0.115.tgz",
-      "integrity": "sha512-Qo6vNE0/UK6azsu9wTpb9AneHpM2FkA/saZ6UB1kvRttD5M0d/xto8sqq6b45QkKukqIlS4MhzyyvLIvC6rI1g==",
+      "version": "0.0.120",
+      "resolved": "https://registry.npmjs.org/@primer/view-components/-/view-components-0.0.120.tgz",
+      "integrity": "sha512-C90cNtB3Zl8B+nLPkztYYMBNTaGxUWLrVroG3a8dIEcpGdEZOhsOPOfeptpyPMolX7DWag/hfzBXBp0i7TawDg==",
       "dependencies": {
         "@github/auto-check-element": "^5.2.0",
         "@github/auto-complete-element": "^3.3.4",
@@ -2088,6 +2025,14 @@
       "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
       "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="
     },
+    "node_modules/@tootallnate/once": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+      "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
     "node_modules/@trysound/sax": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
@@ -2181,9 +2126,9 @@
       }
     },
     "node_modules/@types/node": {
-      "version": "15.12.2",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
-      "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
+      "version": "18.15.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz",
+      "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==",
       "devOptional": true
     },
     "node_modules/@types/prettier": {
@@ -2223,9 +2168,9 @@
       }
     },
     "node_modules/@vue/compiler-sfc": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.1.tgz",
-      "integrity": "sha512-YQRE2uYhlvyFgHmKAqySCdLm7O37XZc+yG9dujwD3h8em+rD1qGOthxc0H3XcijOy50gj/pYHgBO6C3MjV+oug==",
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz",
+      "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==",
       "dependencies": {
         "@babel/parser": "^7.18.4",
         "postcss": "^8.4.14",
@@ -2241,7 +2186,7 @@
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
       "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "devOptional": true
+      "optional": true
     },
     "node_modules/accepts": {
       "version": "1.3.8",
@@ -2256,9 +2201,9 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.8.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
-      "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==",
+      "version": "8.8.2",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
+      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -2275,14 +2220,6 @@
         "acorn-walk": "^8.0.2"
       }
     },
-    "node_modules/acorn-globals/node_modules/acorn-walk": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
-      "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
     "node_modules/acorn-jsx": {
       "version": "5.3.2",
       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
@@ -2292,6 +2229,14 @@
         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
     },
+    "node_modules/acorn-walk": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+      "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
     "node_modules/agent-base": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -2303,73 +2248,20 @@
         "node": ">= 6.0.0"
       }
     },
-    "node_modules/agent-base/node_modules/debug": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/agent-base/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
     "node_modules/agentkeepalive": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz",
-      "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz",
+      "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==",
       "optional": true,
       "dependencies": {
         "debug": "^4.1.0",
-        "depd": "^1.1.2",
+        "depd": "^2.0.0",
         "humanize-ms": "^1.2.1"
       },
       "engines": {
         "node": ">= 8.0.0"
       }
     },
-    "node_modules/agentkeepalive/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "optional": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/agentkeepalive/node_modules/depd": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-      "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
-      "optional": true,
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/agentkeepalive/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "optional": true
-    },
     "node_modules/ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -2453,13 +2345,13 @@
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
       "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
-      "devOptional": true
+      "optional": true
     },
     "node_modules/are-we-there-yet": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
       "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
-      "devOptional": true,
+      "optional": true,
       "dependencies": {
         "delegates": "^1.0.0",
         "readable-stream": "^3.6.0"
@@ -2468,20 +2360,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/are-we-there-yet/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-      "devOptional": true,
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/argparse": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
@@ -2496,7 +2374,7 @@
     "node_modules/array-flatten": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
     },
     "node_modules/asap": {
       "version": "2.0.6",
@@ -2523,14 +2401,14 @@
       }
     },
     "node_modules/async": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
-      "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+      "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
     },
     "node_modules/asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "node_modules/aws-sign2": {
       "version": "0.7.0",
@@ -2542,15 +2420,15 @@
       }
     },
     "node_modules/aws4": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-      "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
+      "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
       "optional": true
     },
     "node_modules/axios": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz",
-      "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==",
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
+      "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
       "dependencies": {
         "follow-redirects": "^1.15.0",
         "form-data": "^4.0.0",
@@ -2682,9 +2560,9 @@
       }
     },
     "node_modules/before-after-hook": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
-      "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ=="
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
+      "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="
     },
     "node_modules/binary-extensions": {
       "version": "2.2.0",
@@ -2698,7 +2576,7 @@
       "version": "1.5.0",
       "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
       "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
-      "dev": true,
+      "optional": true,
       "dependencies": {
         "file-uri-to-path": "1.0.0"
       }
@@ -2713,19 +2591,6 @@
         "readable-stream": "^3.4.0"
       }
     },
-    "node_modules/bl/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/body-parser": {
       "version": "1.20.1",
       "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
@@ -2757,10 +2622,34 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/body-parser/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/body-parser/node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/body-parser/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
     "node_modules/boolbase": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
     },
     "node_modules/brace-expansion": {
       "version": "2.0.1",
@@ -2875,15 +2764,15 @@
       }
     },
     "node_modules/buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
       "devOptional": true
     },
     "node_modules/bytes": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
-      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
       "engines": {
         "node": ">= 0.8"
       }
@@ -2897,13 +2786,13 @@
       }
     },
     "node_modules/cacheable-request": {
-      "version": "10.2.3",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.3.tgz",
-      "integrity": "sha512-6BehRBOs7iurNjAYN9iPazTwFDaMQavJO8W1MEm3s2pH8q/tkPTtLDRUZaweWK87WFGf2Y5wLAlaCJlR5kOz3w==",
+      "version": "10.2.8",
+      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz",
+      "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==",
       "dependencies": {
         "@types/http-cache-semantics": "^4.0.1",
         "get-stream": "^6.0.1",
-        "http-cache-semantics": "^4.1.0",
+        "http-cache-semantics": "^4.1.1",
         "keyv": "^4.5.2",
         "mimic-response": "^4.0.0",
         "normalize-url": "^8.0.0",
@@ -2913,17 +2802,6 @@
         "node": ">=14.16"
       }
     },
-    "node_modules/cacheable-request/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/call-bind": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -2971,9 +2849,8 @@
     },
     "node_modules/canvas": {
       "version": "2.9.0",
-      "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.0.tgz",
-      "integrity": "sha512-0l93g7uxp7rMyr7H+XRQ28A3ud0dKIUTIEkUe1Dxh4rjUYN7B93+SjC3r1PDKA18xcQN87OFGgUnyw7LSgNLSQ==",
       "hasInstallScript": true,
+      "license": "MIT",
       "optional": true,
       "dependencies": {
         "@mapbox/node-pre-gyp": "^1.0.0",
@@ -2984,6 +2861,41 @@
         "node": ">=6"
       }
     },
+    "node_modules/canvas/node_modules/decompress-response": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+      "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+      "optional": true,
+      "dependencies": {
+        "mimic-response": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/canvas/node_modules/mimic-response": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+      "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/canvas/node_modules/simple-get": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
+      "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
+      "optional": true,
+      "dependencies": {
+        "decompress-response": "^4.2.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
     "node_modules/caseless": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -2991,9 +2903,9 @@
       "optional": true
     },
     "node_modules/chalk": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-      "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
       "dependencies": {
         "ansi-styles": "^4.1.0",
         "supports-color": "^7.1.0"
@@ -3015,9 +2927,9 @@
       }
     },
     "node_modules/chardet": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.5.0.tgz",
-      "integrity": "sha512-Nj3VehbbFs/1ZnJJJaL3ztEf3Nu5Fs6YV/NBs6lyz/iDDHUU+X9QNk5QgPy1/5Rjtb/cGVf+NyazP7kVEJqKRg=="
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.5.1.tgz",
+      "integrity": "sha512-0XMOtA52igKDOIfvJZJ6v0+J9yMF3IuYyEa5oFUxBXA01G6mwCNKpul3bgbFf7lmZuqwN/oyg/zQ1cGS7NyJkQ=="
     },
     "node_modules/chartist": {
       "version": "0.11.4",
@@ -3074,20 +2986,31 @@
       }
     },
     "node_modules/chess.js": {
-      "version": "1.0.0-beta.1",
-      "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.0.0-beta.1.tgz",
-      "integrity": "sha512-yXGLpKcorxm8TYzDf7Yu7sxkjuWDeFCFmR4/8GG4+5ksdFbYOyfp+MUtN3Z/EuZr5dOxFgjNyBoqbzQpIN5Z8w==",
+      "version": "1.0.0-beta.3",
+      "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.0.0-beta.3.tgz",
+      "integrity": "sha512-zu8QVvP0BmMzrstlsrXL2LxdHfAkrtyNftVRaJXGI5mn2ZSsgTJujvZx5BVJsPMwBkRZ+omCdZkVyVLBlKn2HA==",
       "optional": true
     },
     "node_modules/chownr": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
       "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-      "devOptional": true,
+      "optional": true,
       "engines": {
         "node": ">=10"
       }
     },
+    "node_modules/chromium-bidi": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.4.tgz",
+      "integrity": "sha512-4BX5cSaponuvVT1+SbLYTOAgDoVtX/Khoc9UsbFJ/AsPVUeFAM3RiIDFI6XFhLYMi9WmVJqh1ZH+dRpNKkKwiQ==",
+      "dependencies": {
+        "mitt": "3.0.0"
+      },
+      "peerDependencies": {
+        "devtools-protocol": "*"
+      }
+    },
     "node_modules/ci-info": {
       "version": "3.8.0",
       "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
@@ -3136,7 +3059,7 @@
     "node_modules/clone": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
-      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
+      "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
       "engines": {
         "node": ">=0.8"
       }
@@ -3144,7 +3067,7 @@
     "node_modules/co": {
       "version": "4.6.0",
       "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+      "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
       "devOptional": true,
       "engines": {
         "iojs": ">= 1.0.0",
@@ -3198,7 +3121,7 @@
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
       "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
-      "devOptional": true,
+      "optional": true,
       "bin": {
         "color-support": "bin.js"
       }
@@ -3255,10 +3178,23 @@
         "node": ">= 0.8.0"
       }
     },
+    "node_modules/compression/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/compression/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
     },
     "node_modules/concat-stream": {
       "version": "1.6.2",
@@ -3275,11 +3211,41 @@
         "typedarray": "^0.0.6"
       }
     },
+    "node_modules/concat-stream/node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "optional": true
+    },
+    "node_modules/concat-stream/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "optional": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/concat-stream/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "optional": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/console-control-strings": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
-      "devOptional": true
+      "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+      "optional": true
     },
     "node_modules/content-disposition": {
       "version": "0.5.4",
@@ -3312,9 +3278,9 @@
       ]
     },
     "node_modules/content-type": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
       "engines": {
         "node": ">= 0.6"
       }
@@ -3326,13 +3292,10 @@
       "optional": true
     },
     "node_modules/convert-source-map": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
-      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-      "devOptional": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.1"
-      }
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+      "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+      "dev": true
     },
     "node_modules/cookie": {
       "version": "0.5.0",
@@ -3345,7 +3308,7 @@
     "node_modules/cookie-signature": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
     },
     "node_modules/core-util-is": {
       "version": "1.0.3",
@@ -3354,9 +3317,9 @@
       "optional": true
     },
     "node_modules/cosmiconfig": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz",
-      "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==",
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz",
+      "integrity": "sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==",
       "dependencies": {
         "import-fresh": "^3.2.1",
         "js-yaml": "^4.1.0",
@@ -3365,6 +3328,9 @@
       },
       "engines": {
         "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/d-fischer"
       }
     },
     "node_modules/cross-fetch": {
@@ -3394,15 +3360,20 @@
         }
       }
     },
+    "node_modules/cross-fetch/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
     "node_modules/cross-fetch/node_modules/webidl-conversions": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
     },
     "node_modules/cross-fetch/node_modules/whatwg-url": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
       "dependencies": {
         "tr46": "~0.0.3",
         "webidl-conversions": "^3.0.0"
@@ -3497,35 +3468,31 @@
       }
     },
     "node_modules/cssom": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
-      "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="
+      "version": "0.3.8",
+      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+      "optional": true
     },
     "node_modules/cssstyle": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
-      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz",
+      "integrity": "sha512-N4u2ABATi3Qplzf0hWbVCdjenim8F3ojEXpBDF5hBpjzW182MjNGLqfmQ0SkSPeQ+V86ZXgeH8aXj6kayd4jgg==",
       "dependencies": {
-        "cssom": "~0.3.6"
+        "rrweb-cssom": "^0.6.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=14"
       }
     },
-    "node_modules/cssstyle/node_modules/cssom": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
-    },
     "node_modules/csstype": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
-      "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
+      "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
     },
     "node_modules/d3": {
-      "version": "7.8.1",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.1.tgz",
-      "integrity": "sha512-fdipulGWUYTZTxxU9gDJ2P4mpZL2u7Oqe6n2FI95Q8UY0AjbKNYjPHvhLOsvR+HcSao4vo3YYy4Bk9CWOrt1Vw==",
+      "version": "7.8.2",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz",
+      "integrity": "sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==",
       "dependencies": {
         "d3-array": "3",
         "d3-axis": "3",
@@ -3563,9 +3530,9 @@
       }
     },
     "node_modules/d3-array": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz",
-      "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==",
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz",
+      "integrity": "sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==",
       "dependencies": {
         "internmap": "1 - 2"
       },
@@ -3616,9 +3583,9 @@
       }
     },
     "node_modules/d3-contour": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.0.tgz",
-      "integrity": "sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz",
+      "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==",
       "dependencies": {
         "d3-array": "^3.2.0"
       },
@@ -3681,17 +3648,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/d3-dsv/node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/d3-ease": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
@@ -3733,9 +3689,9 @@
       }
     },
     "node_modules/d3-geo": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz",
-      "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz",
+      "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==",
       "dependencies": {
         "d3-array": "2.5.0 - 3"
       },
@@ -3763,9 +3719,9 @@
       }
     },
     "node_modules/d3-path": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz",
-      "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz",
+      "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==",
       "engines": {
         "node": ">=12"
       }
@@ -3830,20 +3786,20 @@
       }
     },
     "node_modules/d3-shape": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz",
-      "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz",
+      "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==",
       "dependencies": {
-        "d3-path": "1 - 3"
+        "d3-path": "^3.1.0"
       },
       "engines": {
         "node": ">=12"
       }
     },
     "node_modules/d3-time": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz",
-      "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz",
+      "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==",
       "dependencies": {
         "d3-array": "2 - 3"
       },
@@ -3916,19 +3872,40 @@
       }
     },
     "node_modules/data-uri-to-buffer": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
-      "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
+      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
       "engines": {
         "node": ">= 12"
       }
     },
+    "node_modules/data-urls": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-4.0.0.tgz",
+      "integrity": "sha512-/mMTei/JXPqvFqQtfyTowxmJVwr2PVAeCcDxyFf6LhoOu/09TX2OX3kb2wzi4DMXcfj4OItwDOnhl5oziPnT6g==",
+      "dependencies": {
+        "abab": "^2.0.6",
+        "whatwg-mimetype": "^3.0.0",
+        "whatwg-url": "^12.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
     "node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dependencies": {
-        "ms": "2.0.0"
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
     "node_modules/decimal.js": {
@@ -3985,14 +3962,14 @@
       }
     },
     "node_modules/deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
     },
     "node_modules/deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
+      "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -4016,7 +3993,7 @@
     "node_modules/delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
       "engines": {
         "node": ">=0.4.0"
       }
@@ -4029,8 +4006,8 @@
     "node_modules/delegates": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
-      "devOptional": true
+      "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
+      "optional": true
     },
     "node_modules/depd": {
       "version": "2.0.0",
@@ -4072,9 +4049,9 @@
       }
     },
     "node_modules/devtools-protocol": {
-      "version": "0.0.1068969",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1068969.tgz",
-      "integrity": "sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ=="
+      "version": "0.0.1094867",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1094867.tgz",
+      "integrity": "sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ=="
     },
     "node_modules/diff-sequences": {
       "version": "29.4.3",
@@ -4110,17 +4087,6 @@
         "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
       }
     },
-    "node_modules/dom-serializer/node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
     "node_modules/domelementtype": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
@@ -4132,6 +4098,17 @@
         }
       ]
     },
+    "node_modules/domexception": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+      "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+      "dependencies": {
+        "webidl-conversions": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/domhandler": {
       "version": "5.0.3",
       "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
@@ -4159,6 +4136,20 @@
         "url": "https://github.com/fb55/domutils?sponsor=1"
       }
     },
+    "node_modules/dprint": {
+      "version": "0.35.1",
+      "resolved": "https://registry.npmjs.org/dprint/-/dprint-0.35.1.tgz",
+      "integrity": "sha512-x9ZbA5qtKEnMioQE8++lKIq3eZrwfP188wTOpuxVIEBxIYKKyZLp27klobIOcyNnZ5DnaxWmdbinX2e51WG9YQ==",
+      "dev": true,
+      "hasInstallScript": true,
+      "dependencies": {
+        "https-proxy-agent": "=5.0.1",
+        "yauzl": "=2.10.0"
+      },
+      "bin": {
+        "dprint": "bin.js"
+      }
+    },
     "node_modules/duplexer2": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
@@ -4168,6 +4159,36 @@
         "readable-stream": "^2.0.2"
       }
     },
+    "node_modules/duplexer2/node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "optional": true
+    },
+    "node_modules/duplexer2/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "optional": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/duplexer2/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "optional": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/ecc-jsbn": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -4181,12 +4202,12 @@
     "node_modules/ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
     },
     "node_modules/ejs": {
-      "version": "3.1.8",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
-      "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
+      "version": "3.1.9",
+      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
+      "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
       "dependencies": {
         "jake": "^10.8.5"
       },
@@ -4239,7 +4260,7 @@
     "node_modules/encodeurl": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
       "engines": {
         "node": ">= 0.8"
       }
@@ -4253,9 +4274,12 @@
       }
     },
     "node_modules/entities": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
+      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+      "engines": {
+        "node": ">=0.12"
+      },
       "funding": {
         "url": "https://github.com/fb55/entities?sponsor=1"
       }
@@ -4280,7 +4304,7 @@
     "node_modules/escape-html": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
     },
     "node_modules/escape-string-regexp": {
       "version": "4.0.0",
@@ -4294,13 +4318,12 @@
       }
     },
     "node_modules/escodegen": {
-      "version": "1.14.3",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
-      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
-      "optional": true,
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
+      "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
       "dependencies": {
         "esprima": "^4.0.1",
-        "estraverse": "^4.2.0",
+        "estraverse": "^5.2.0",
         "esutils": "^2.0.2",
         "optionator": "^0.8.1"
       },
@@ -4309,26 +4332,16 @@
         "esgenerate": "bin/esgenerate.js"
       },
       "engines": {
-        "node": ">=4.0"
+        "node": ">=6.0"
       },
       "optionalDependencies": {
         "source-map": "~0.6.1"
       }
     },
-    "node_modules/escodegen/node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "optional": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
     "node_modules/escodegen/node_modules/levn": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
       "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-      "optional": true,
       "dependencies": {
         "prelude-ls": "~1.1.2",
         "type-check": "~0.3.2"
@@ -4341,7 +4354,6 @@
       "version": "0.8.3",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
       "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "optional": true,
       "dependencies": {
         "deep-is": "~0.1.3",
         "fast-levenshtein": "~2.0.6",
@@ -4358,7 +4370,6 @@
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
       "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
-      "optional": true,
       "engines": {
         "node": ">= 0.8.0"
       }
@@ -4367,7 +4378,6 @@
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
       "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-      "optional": true,
       "dependencies": {
         "prelude-ls": "~1.1.2"
       },
@@ -4376,13 +4386,15 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.35.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz",
-      "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==",
+      "version": "8.36.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
+      "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
       "dev": true,
       "dependencies": {
-        "@eslint/eslintrc": "^2.0.0",
-        "@eslint/js": "8.35.0",
+        "@eslint-community/eslint-utils": "^4.2.0",
+        "@eslint-community/regexpp": "^4.4.0",
+        "@eslint/eslintrc": "^2.0.1",
+        "@eslint/js": "8.36.0",
         "@humanwhocodes/config-array": "^0.11.8",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
@@ -4393,9 +4405,8 @@
         "doctrine": "^3.0.0",
         "escape-string-regexp": "^4.0.0",
         "eslint-scope": "^7.1.1",
-        "eslint-utils": "^3.0.0",
         "eslint-visitor-keys": "^3.3.0",
-        "espree": "^9.4.0",
+        "espree": "^9.5.0",
         "esquery": "^1.4.2",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -4417,7 +4428,6 @@
         "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
         "optionator": "^0.9.1",
-        "regexpp": "^3.2.0",
         "strip-ansi": "^6.0.1",
         "strip-json-comments": "^3.1.0",
         "text-table": "^0.2.0"
@@ -4445,33 +4455,6 @@
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
-    "node_modules/eslint-utils": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
-      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
-      "dev": true,
-      "dependencies": {
-        "eslint-visitor-keys": "^2.0.0"
-      },
-      "engines": {
-        "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      },
-      "peerDependencies": {
-        "eslint": ">=5"
-      }
-    },
-    "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-      "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/eslint-visitor-keys": {
       "version": "3.3.0",
       "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
@@ -4491,108 +4474,27 @@
         "concat-map": "0.0.1"
       }
     },
-    "node_modules/eslint/node_modules/debug": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-      "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+    "node_modules/eslint/node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
       "dev": true,
       "dependencies": {
-        "ms": "2.1.2"
+        "brace-expansion": "^1.1.7"
       },
       "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
+        "node": "*"
       }
     },
-    "node_modules/eslint/node_modules/find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+    "node_modules/espree": {
+      "version": "9.5.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
+      "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
       "dev": true,
       "dependencies": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/eslint/node_modules/glob-parent": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
-      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
-      "dev": true,
-      "dependencies": {
-        "is-glob": "^4.0.3"
-      },
-      "engines": {
-        "node": ">=10.13.0"
-      }
-    },
-    "node_modules/eslint/node_modules/locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/eslint/node_modules/minimatch": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/eslint/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
-    "node_modules/eslint/node_modules/p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/espree": {
-      "version": "9.4.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
-      "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
-      "dev": true,
-      "dependencies": {
-        "acorn": "^8.8.0",
-        "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.3.0"
+        "acorn": "^8.8.0",
+        "acorn-jsx": "^5.3.2",
+        "eslint-visitor-keys": "^3.3.0"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -4614,9 +4516,9 @@
       }
     },
     "node_modules/esquery": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
-      "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+      "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
       "dev": true,
       "dependencies": {
         "estraverse": "^5.1.0"
@@ -4656,7 +4558,7 @@
     "node_modules/etag": {
       "version": "1.8.1",
       "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
       "engines": {
         "node": ">= 0.6"
       }
@@ -4684,18 +4586,6 @@
         "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
-    "node_modules/execa/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/exit": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -4781,6 +4671,19 @@
         "express": "^4 || ^5"
       }
     },
+    "node_modules/express/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/express/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
     "node_modules/express/node_modules/safe-buffer": {
       "version": "5.2.1",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -4825,27 +4728,20 @@
         "@types/yauzl": "^2.9.1"
       }
     },
-    "node_modules/extract-zip/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+    "node_modules/extract-zip/node_modules/get-stream": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
       "dependencies": {
-        "ms": "2.1.2"
+        "pump": "^3.0.0"
       },
       "engines": {
-        "node": ">=6.0"
+        "node": ">=8"
       },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/extract-zip/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
     "node_modules/extsprintf": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
@@ -4895,12 +4791,12 @@
     "node_modules/fast-levenshtein": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
     },
     "node_modules/fastq": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+      "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
       "dev": true,
       "dependencies": {
         "reusify": "^1.0.4"
@@ -4924,9 +4820,9 @@
       }
     },
     "node_modules/fetch-blob": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.4.tgz",
-      "integrity": "sha512-Eq5Xv5+VlSrYWEqKrusxY1C3Hm/hjeAsCGVG3ft7pZahlUAChpGZT/Ms1WmSLnEAisEXszjzu/s+ce6HZB2VHA==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
+      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
       "funding": [
         {
           "type": "github",
@@ -4958,9 +4854,9 @@
       }
     },
     "node_modules/file-type": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.0.tgz",
-      "integrity": "sha512-M3RQMWY3F2ykyWZ+IHwNCjpnUmukYhtdkGGC1ZVEUb0ve5REGF7NNJ4Q9ehCUabtQKtSVFOMbFTXgJlFb0DQIg==",
+      "version": "18.2.1",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz",
+      "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==",
       "dependencies": {
         "readable-web-to-node-stream": "^3.0.2",
         "strtok3": "^7.0.0",
@@ -4977,20 +4873,20 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
       "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
-      "dev": true
+      "optional": true
     },
     "node_modules/filelist": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz",
-      "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==",
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+      "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
       "dependencies": {
         "minimatch": "^5.0.1"
       }
     },
     "node_modules/filelist/node_modules/minimatch": {
-      "version": "5.1.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
-      "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -5036,17 +4932,33 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/finalhandler/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/finalhandler/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
     "node_modules/find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
       "dev": true,
       "dependencies": {
-        "locate-path": "^5.0.0",
+        "locate-path": "^6.0.0",
         "path-exists": "^4.0.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/flat-cache": {
@@ -5063,9 +4975,9 @@
       }
     },
     "node_modules/flatted": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
-      "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz",
+      "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
       "dev": true
     },
     "node_modules/follow-redirects": {
@@ -5139,7 +5051,7 @@
     "node_modules/fresh": {
       "version": "0.5.2",
       "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
       "engines": {
         "node": ">= 0.6"
       }
@@ -5153,7 +5065,7 @@
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
       "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-      "devOptional": true,
+      "optional": true,
       "dependencies": {
         "minipass": "^3.0.0"
       },
@@ -5161,10 +5073,28 @@
         "node": ">= 8"
       }
     },
+    "node_modules/fs-minipass/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "optional": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/fs-minipass/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "optional": true
+    },
     "node_modules/fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     },
     "node_modules/fsevents": {
       "version": "2.3.2",
@@ -5189,7 +5119,7 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
       "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
-      "devOptional": true,
+      "optional": true,
       "dependencies": {
         "aproba": "^1.0.3 || ^2.0.0",
         "color-support": "^1.1.2",
@@ -5224,9 +5154,9 @@
       }
     },
     "node_modules/get-intrinsic": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
-      "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
+      "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
       "dependencies": {
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
@@ -5246,14 +5176,11 @@
       }
     },
     "node_modules/get-stream": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-      "dependencies": {
-        "pump": "^3.0.0"
-      },
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
       "engines": {
-        "node": ">=8"
+        "node": ">=10"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -5283,14 +5210,15 @@
       "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
     },
     "node_modules/glob": {
-      "version": "7.1.7",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
-      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "devOptional": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
         "inherits": "2",
-        "minimatch": "^3.0.4",
+        "minimatch": "^3.1.1",
         "once": "^1.3.0",
         "path-is-absolute": "^1.0.0"
       },
@@ -5301,19 +5229,33 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
+    "node_modules/glob-parent": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+      "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.3"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
     "node_modules/glob/node_modules/brace-expansion": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "devOptional": true,
       "dependencies": {
         "balanced-match": "^1.0.0",
         "concat-map": "0.0.1"
       }
     },
     "node_modules/glob/node_modules/minimatch": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.1.tgz",
-      "integrity": "sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==",
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "devOptional": true,
       "dependencies": {
         "brace-expansion": "^1.1.7"
       },
@@ -5339,20 +5281,20 @@
     "node_modules/good-listener": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
-      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
+      "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
       "dependencies": {
         "delegate": "^3.1.2"
       }
     },
     "node_modules/got": {
-      "version": "12.5.3",
-      "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz",
-      "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==",
+      "version": "12.6.0",
+      "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz",
+      "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==",
       "dependencies": {
         "@sindresorhus/is": "^5.2.0",
         "@szmarczak/http-timer": "^5.0.1",
         "cacheable-lookup": "^7.0.0",
-        "cacheable-request": "^10.2.1",
+        "cacheable-request": "^10.2.8",
         "decompress-response": "^6.0.0",
         "form-data-encoder": "^2.1.2",
         "get-stream": "^6.0.1",
@@ -5368,17 +5310,6 @@
         "url": "https://github.com/sindresorhus/got?sponsor=1"
       }
     },
-    "node_modules/got/node_modules/get-stream": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-      "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/graceful-fs": {
       "version": "4.2.10",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
@@ -5447,8 +5378,8 @@
     "node_modules/has-unicode": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
-      "devOptional": true
+      "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
+      "optional": true
     },
     "node_modules/html-encoding-sniffer": {
       "version": "3.0.0",
@@ -5461,28 +5392,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/html-encoding-sniffer/node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/html-encoding-sniffer/node_modules/whatwg-encoding": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
-      "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
-      "dependencies": {
-        "iconv-lite": "0.6.3"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
     "node_modules/html-escaper": {
       "version": "2.0.2",
       "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
@@ -5507,21 +5416,10 @@
         "entities": "^4.3.0"
       }
     },
-    "node_modules/htmlparser2/node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
     "node_modules/http-cache-semantics": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+      "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
     },
     "node_modules/http-errors": {
       "version": "2.0.0",
@@ -5538,6 +5436,19 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/http-proxy-agent": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+      "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+      "dependencies": {
+        "@tootallnate/once": "2",
+        "agent-base": "6",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
     "node_modules/http-signature": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
@@ -5577,32 +5488,11 @@
         "node": ">= 6"
       }
     },
-    "node_modules/https-proxy-agent/node_modules/debug": {
-      "version": "4.3.1",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/https-proxy-agent/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
-    "node_modules/human-signals": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
-      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
-      "dev": true,
+    "node_modules/human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "dev": true,
       "engines": {
         "node": ">=10.17.0"
       }
@@ -5617,11 +5507,11 @@
       }
     },
     "node_modules/iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
       "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3"
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
       },
       "engines": {
         "node": ">=0.10.0"
@@ -5691,7 +5581,7 @@
     "node_modules/imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
       "dev": true,
       "engines": {
         "node": ">=0.8.19"
@@ -5700,7 +5590,7 @@
     "node_modules/inflight": {
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
       "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -5744,9 +5634,9 @@
       "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
     },
     "node_modules/is-core-module": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
-      "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
+      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
       "devOptional": true,
       "dependencies": {
         "has": "^1.0.3"
@@ -5758,7 +5648,7 @@
     "node_modules/is-extglob": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
@@ -5850,9 +5740,9 @@
       "optional": true
     },
     "node_modules/isbinaryfile": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz",
-      "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==",
+      "version": "4.0.10",
+      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
+      "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
       "engines": {
         "node": ">= 8.0.0"
       },
@@ -5863,7 +5753,7 @@
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
       "dev": true
     },
     "node_modules/isstream": {
@@ -5897,15 +5787,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/istanbul-lib-instrument/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
     "node_modules/istanbul-lib-report": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
@@ -5934,29 +5815,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/istanbul-lib-source-maps/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/istanbul-lib-source-maps/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
     "node_modules/istanbul-reports": {
       "version": "3.1.5",
       "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
@@ -6475,6 +6333,39 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
+    "node_modules/jest-snapshot/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-snapshot/node_modules/semver": {
+      "version": "7.3.8",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "dev": true,
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/jest-snapshot/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
+    },
     "node_modules/jest-util": {
       "version": "29.5.0",
       "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
@@ -6571,10 +6462,14 @@
       }
     },
     "node_modules/js-sdsl": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
-      "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==",
-      "dev": true
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
+      "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
+      "dev": true,
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/js-sdsl"
+      }
     },
     "node_modules/js-tokens": {
       "version": "4.0.0",
@@ -6599,17 +6494,16 @@
       "optional": true
     },
     "node_modules/jsdom": {
-      "version": "21.0.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.0.0.tgz",
-      "integrity": "sha512-AIw+3ZakSUtDYvhwPwWHiZsUi3zHugpMEKlNPaurviseYoBqo0zBd3zqoUi3LPCNtPFlEP8FiW9MqCZdjb2IYA==",
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.1.tgz",
+      "integrity": "sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w==",
       "dependencies": {
         "abab": "^2.0.6",
-        "acorn": "^8.8.1",
+        "acorn": "^8.8.2",
         "acorn-globals": "^7.0.0",
-        "cssom": "^0.5.0",
-        "cssstyle": "^2.3.0",
-        "data-urls": "^3.0.2",
-        "decimal.js": "^10.4.2",
+        "cssstyle": "^3.0.0",
+        "data-urls": "^4.0.0",
+        "decimal.js": "^10.4.3",
         "domexception": "^4.0.0",
         "escodegen": "^2.0.0",
         "form-data": "^4.0.0",
@@ -6618,7 +6512,8 @@
         "https-proxy-agent": "^5.0.1",
         "is-potential-custom-element-name": "^1.0.1",
         "nwsapi": "^2.2.2",
-        "parse5": "^7.1.1",
+        "parse5": "^7.1.2",
+        "rrweb-cssom": "^0.6.0",
         "saxes": "^6.0.0",
         "symbol-tree": "^3.2.4",
         "tough-cookie": "^4.1.2",
@@ -6626,8 +6521,8 @@
         "webidl-conversions": "^7.0.0",
         "whatwg-encoding": "^2.0.0",
         "whatwg-mimetype": "^3.0.0",
-        "whatwg-url": "^11.0.0",
-        "ws": "^8.11.0",
+        "whatwg-url": "^12.0.1",
+        "ws": "^8.13.0",
         "xml-name-validator": "^4.0.0"
       },
       "engines": {
@@ -6642,317 +6537,131 @@
         }
       }
     },
-    "node_modules/jsdom/node_modules/@tootallnate/once": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
-      "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+    "node_modules/jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "dev": true,
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
       "engines": {
-        "node": ">= 10"
+        "node": ">=4"
       }
     },
-    "node_modules/jsdom/node_modules/data-urls": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
-      "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
-      "dependencies": {
-        "abab": "^2.0.6",
-        "whatwg-mimetype": "^3.0.0",
-        "whatwg-url": "^11.0.0"
+    "node_modules/json-buffer": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+    },
+    "node_modules/json-schema": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+      "optional": true
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "devOptional": true
+    },
+    "node_modules/json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+      "dev": true
+    },
+    "node_modules/json-stringify-safe": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+      "optional": true
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "dev": true,
+      "bin": {
+        "json5": "lib/cli.js"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=6"
       }
     },
-    "node_modules/jsdom/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+    "node_modules/jsprim": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
+      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
+      "optional": true,
       "dependencies": {
-        "ms": "2.1.2"
+        "assert-plus": "1.0.0",
+        "extsprintf": "1.3.0",
+        "json-schema": "0.4.0",
+        "verror": "1.10.0"
       },
       "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
+        "node": ">=0.6.0"
       }
     },
-    "node_modules/jsdom/node_modules/domexception": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
-      "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+    "node_modules/keyv": {
+      "version": "4.5.2",
+      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
+      "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
       "dependencies": {
-        "webidl-conversions": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=12"
+        "json-buffer": "3.0.1"
       }
     },
-    "node_modules/jsdom/node_modules/escodegen": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
-      "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
-      "dependencies": {
-        "esprima": "^4.0.1",
-        "estraverse": "^5.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1"
-      },
-      "bin": {
-        "escodegen": "bin/escodegen.js",
-        "esgenerate": "bin/esgenerate.js"
-      },
+    "node_modules/kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "dev": true,
       "engines": {
-        "node": ">=6.0"
-      },
-      "optionalDependencies": {
-        "source-map": "~0.6.1"
+        "node": ">=6"
       }
     },
-    "node_modules/jsdom/node_modules/http-proxy-agent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
-      "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
-      "dependencies": {
-        "@tootallnate/once": "2",
-        "agent-base": "6",
-        "debug": "4"
-      },
+    "node_modules/leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "dev": true,
       "engines": {
-        "node": ">= 6"
+        "node": ">=6"
       }
     },
-    "node_modules/jsdom/node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+    "node_modules/levn": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+      "dev": true,
       "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
+        "prelude-ls": "^1.2.1",
+        "type-check": "~0.4.0"
       },
       "engines": {
-        "node": ">=0.10.0"
+        "node": ">= 0.8.0"
       }
     },
-    "node_modules/jsdom/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+    "node_modules/libxmljs2": {
+      "version": "0.31.0",
+      "resolved": "https://registry.npmjs.org/libxmljs2/-/libxmljs2-0.31.0.tgz",
+      "integrity": "sha512-+o8y4lhmmf7zUA67watbLcAcxE0lkBkuatoIwgFkWTmuFTPEOZKunNpSjW6V7ONzAj8Ey1qVeR12q1JMU/sTlQ==",
+      "hasInstallScript": true,
+      "optional": true,
       "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
+        "@mapbox/node-pre-gyp": "^1.0.10",
+        "bindings": "~1.5.0",
+        "nan": "~2.17.0"
       },
       "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/jsdom/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
-    "node_modules/jsdom/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/jsdom/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/jsdom/node_modules/saxes": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
-      "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
-      "dependencies": {
-        "xmlchars": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=v12.22.7"
-      }
-    },
-    "node_modules/jsdom/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/jsdom/node_modules/w3c-xmlserializer": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
-      "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
-      "dependencies": {
-        "xml-name-validator": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=14"
-      }
-    },
-    "node_modules/jsdom/node_modules/whatwg-encoding": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
-      "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
-      "dependencies": {
-        "iconv-lite": "0.6.3"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/jsdom/node_modules/whatwg-mimetype": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
-      "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true,
-      "bin": {
-        "jsesc": "bin/jsesc"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/json-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
-    },
-    "node_modules/json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
-    },
-    "node_modules/json-schema": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
-      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
-      "optional": true
-    },
-    "node_modules/json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "devOptional": true
-    },
-    "node_modules/json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
-      "dev": true
-    },
-    "node_modules/json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
-      "optional": true
-    },
-    "node_modules/json5": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
-      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-      "dev": true,
-      "bin": {
-        "json5": "lib/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/jsprim": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
-      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
-      "optional": true,
-      "dependencies": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.4.0",
-        "verror": "1.10.0"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
-    },
-    "node_modules/keyv": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
-      "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
-      "dependencies": {
-        "json-buffer": "3.0.1"
-      }
-    },
-    "node_modules/kleur": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
-      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/leven": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
-      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-      "dev": true,
-      "dependencies": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/libxmljs2": {
-      "version": "0.31.0",
-      "resolved": "https://registry.npmjs.org/libxmljs2/-/libxmljs2-0.31.0.tgz",
-      "integrity": "sha512-+o8y4lhmmf7zUA67watbLcAcxE0lkBkuatoIwgFkWTmuFTPEOZKunNpSjW6V7ONzAj8Ey1qVeR12q1JMU/sTlQ==",
-      "dev": true,
-      "hasInstallScript": true,
-      "dependencies": {
-        "@mapbox/node-pre-gyp": "^1.0.10",
-        "bindings": "~1.5.0",
-        "nan": "~2.17.0"
-      },
-      "engines": {
-        "node": ">=12"
+        "node": ">=12"
       }
     },
     "node_modules/lines-and-columns": {
@@ -6991,15 +6700,18 @@
       }
     },
     "node_modules/locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
       "dev": true,
       "dependencies": {
-        "p-locate": "^4.1.0"
+        "p-locate": "^5.0.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/lodash.merge": {
@@ -7020,14 +6732,12 @@
       }
     },
     "node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dev": true,
       "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
+        "yallist": "^3.0.2"
       }
     },
     "node_modules/magic-string": {
@@ -7054,15 +6764,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/make-dir/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "devOptional": true,
-      "bin": {
-        "semver": "bin/semver.js"
-      }
-    },
     "node_modules/makeerror": {
       "version": "1.0.12",
       "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
@@ -7121,7 +6822,7 @@
     "node_modules/merge-descriptors": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
     },
     "node_modules/merge-source-map": {
       "version": "1.0.4",
@@ -7150,7 +6851,7 @@
     "node_modules/methods": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
-      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
       "engines": {
         "node": ">= 0.6"
       }
@@ -7219,9 +6920,9 @@
       }
     },
     "node_modules/minimatch": {
-      "version": "6.1.6",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.1.6.tgz",
-      "integrity": "sha512-6bR3UIeh/DF8+p6A9Spyuy67ShOq42rOkHWi7eUe3Ua99Zo5lZfGC6lJJWkeoK4k9jQFT3Pl7czhTXimG2XheA==",
+      "version": "7.4.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz",
+      "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -7233,18 +6934,17 @@
       }
     },
     "node_modules/minimist": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
-      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/minipass": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
-      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
-      "devOptional": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
+      "version": "4.2.5",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz",
+      "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==",
       "engines": {
         "node": ">=8"
       }
@@ -7253,7 +6953,7 @@
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
       "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-      "devOptional": true,
+      "optional": true,
       "dependencies": {
         "minipass": "^3.0.0",
         "yallist": "^4.0.0"
@@ -7262,21 +6962,56 @@
         "node": ">= 8"
       }
     },
-    "node_modules/mkdirp-classic": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
-      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
+    "node_modules/minizlib/node_modules/minipass": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+      "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+      "optional": true,
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
     },
-    "node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    "node_modules/minizlib/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "optional": true
+    },
+    "node_modules/mitt": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
+      "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ=="
+    },
+    "node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "optional": true,
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/mkdirp-classic": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
     "node_modules/nan": {
       "version": "2.17.0",
       "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
       "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
-      "devOptional": true
+      "optional": true
     },
     "node_modules/nanoid": {
       "version": "3.3.4",
@@ -7297,7 +7032,7 @@
     "node_modules/natural-compare": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
       "dev": true
     },
     "node_modules/negotiator": {
@@ -7309,9 +7044,9 @@
       }
     },
     "node_modules/node-abi": {
-      "version": "3.22.0",
-      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz",
-      "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==",
+      "version": "3.33.0",
+      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz",
+      "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==",
       "dependencies": {
         "semver": "^7.3.5"
       },
@@ -7319,10 +7054,40 @@
         "node": ">=10"
       }
     },
+    "node_modules/node-abi/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/node-abi/node_modules/semver": {
+      "version": "7.3.8",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/node-abi/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
     "node_modules/node-addon-api": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz",
-      "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA=="
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
+      "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="
     },
     "node_modules/node-cache": {
       "version": "5.1.2",
@@ -7381,12 +7146,6 @@
         "acorn": "^4.0.4"
       }
     },
-    "node_modules/node-chartist/node_modules/cssom": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-      "optional": true
-    },
     "node_modules/node-chartist/node_modules/cssstyle": {
       "version": "0.2.37",
       "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
@@ -7396,6 +7155,37 @@
         "cssom": "0.3.x"
       }
     },
+    "node_modules/node-chartist/node_modules/escodegen": {
+      "version": "1.14.3",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+      "optional": true,
+      "dependencies": {
+        "esprima": "^4.0.1",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1"
+      },
+      "bin": {
+        "escodegen": "bin/escodegen.js",
+        "esgenerate": "bin/esgenerate.js"
+      },
+      "engines": {
+        "node": ">=4.0"
+      },
+      "optionalDependencies": {
+        "source-map": "~0.6.1"
+      }
+    },
+    "node_modules/node-chartist/node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "optional": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
     "node_modules/node-chartist/node_modules/html-encoding-sniffer": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
@@ -7405,6 +7195,18 @@
         "whatwg-encoding": "^1.0.1"
       }
     },
+    "node_modules/node-chartist/node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "optional": true,
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/node-chartist/node_modules/jsdom": {
       "version": "9.12.0",
       "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz",
@@ -7432,12 +7234,51 @@
         "xml-name-validator": "^2.0.1"
       }
     },
+    "node_modules/node-chartist/node_modules/levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+      "optional": true,
+      "dependencies": {
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/node-chartist/node_modules/optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+      "optional": true,
+      "dependencies": {
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
     "node_modules/node-chartist/node_modules/parse5": {
       "version": "1.5.1",
       "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
       "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==",
       "optional": true
     },
+    "node_modules/node-chartist/node_modules/prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+      "optional": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
     "node_modules/node-chartist/node_modules/tough-cookie": {
       "version": "2.5.0",
       "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
@@ -7451,12 +7292,39 @@
         "node": ">=0.8"
       }
     },
+    "node_modules/node-chartist/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+      "optional": true
+    },
+    "node_modules/node-chartist/node_modules/type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+      "optional": true,
+      "dependencies": {
+        "prelude-ls": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
     "node_modules/node-chartist/node_modules/webidl-conversions": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
       "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
       "optional": true
     },
+    "node_modules/node-chartist/node_modules/whatwg-encoding": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
+      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
+      "optional": true,
+      "dependencies": {
+        "iconv-lite": "0.4.24"
+      }
+    },
     "node_modules/node-chartist/node_modules/whatwg-url": {
       "version": "4.8.0",
       "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz",
@@ -7498,9 +7366,9 @@
       }
     },
     "node_modules/node-fetch": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz",
-      "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz",
+      "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==",
       "dependencies": {
         "data-uri-to-buffer": "^4.0.0",
         "fetch-blob": "^3.1.4",
@@ -7539,7 +7407,7 @@
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
       "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
-      "devOptional": true,
+      "optional": true,
       "dependencies": {
         "abbrev": "1"
       },
@@ -7586,7 +7454,7 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
       "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
-      "devOptional": true,
+      "optional": true,
       "dependencies": {
         "are-we-there-yet": "^2.0.0",
         "console-control-strings": "^1.1.0",
@@ -7595,9 +7463,9 @@
       }
     },
     "node_modules/nth-check": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
-      "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
       "dependencies": {
         "boolbase": "^1.0.0"
       },
@@ -7628,16 +7496,18 @@
     "node_modules/object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
       "engines": {
         "node": ">=0.10.0"
       }
     },
     "node_modules/object-inspect": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz",
-      "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==",
-      "optional": true
+      "version": "1.12.3",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz",
+      "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
     },
     "node_modules/on-finished": {
       "version": "2.4.1",
@@ -7661,7 +7531,7 @@
     "node_modules/once": {
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
       "dependencies": {
         "wrappy": "1"
       }
@@ -7682,31 +7552,20 @@
       }
     },
     "node_modules/open-graph-scraper": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-5.0.3.tgz",
-      "integrity": "sha512-TwDOwvQlm6h14chfjyzBXCHhW99SIU399cRQBcx0mxzl1fvIjDTlWVwAN2q7+A8YTfuvXoV2fwAYI+HmVVw5pg==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-5.1.1.tgz",
+      "integrity": "sha512-6InA4pCjiWk7bAQWzVtjJrJRXAdaLdYBaNxuUU8UAgYbz5MWN4YLkgZkRtqgSf0F6VPOWDe3BGQNKwSCgYu05w==",
       "dependencies": {
-        "chardet": "^1.5.0",
+        "chardet": "^1.5.1",
         "cheerio": "^1.0.0-rc.12",
-        "got": "^12.5.3",
+        "got": "^12.6.0",
         "iconv-lite": "^0.6.3",
-        "validator": "^13.7.0"
+        "validator": "^13.9.0"
       },
       "engines": {
         "node": ">=14.16"
       }
     },
-    "node_modules/open-graph-scraper/node_modules/iconv-lite": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3.0.0"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/optionator": {
       "version": "0.9.1",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
@@ -7748,27 +7607,15 @@
       }
     },
     "node_modules/p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.2.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/p-locate/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
       "dev": true,
       "dependencies": {
-        "p-try": "^2.0.0"
+        "p-limit": "^3.0.2"
       },
       "engines": {
-        "node": ">=6"
+        "node": ">=10"
       },
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
@@ -7814,7 +7661,7 @@
     "node_modules/parse-srcset": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
-      "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE="
+      "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q=="
     },
     "node_modules/parse5": {
       "version": "7.1.2",
@@ -7839,17 +7686,6 @@
         "url": "https://github.com/inikulin/parse5?sponsor=1"
       }
     },
-    "node_modules/parse5/node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
-      "engines": {
-        "node": ">=0.12"
-      },
-      "funding": {
-        "url": "https://github.com/fb55/entities?sponsor=1"
-      }
-    },
     "node_modules/parseurl": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -7870,7 +7706,8 @@
     "node_modules/path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "devOptional": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -7890,10 +7727,33 @@
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
       "devOptional": true
     },
+    "node_modules/path-scurry": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz",
+      "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==",
+      "dependencies": {
+        "lru-cache": "^7.14.1",
+        "minipass": "^4.0.2"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/path-scurry/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/path-to-regexp": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
     },
     "node_modules/path-type": {
       "version": "4.0.0",
@@ -7964,38 +7824,90 @@
         "node": ">=8"
       }
     },
-    "node_modules/png-js": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
-      "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
-    },
-    "node_modules/postcss": {
-      "version": "8.4.14",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
-      "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
-      "funding": [
-        {
-          "type": "opencollective",
-          "url": "https://opencollective.com/postcss/"
-        },
-        {
-          "type": "tidelift",
-          "url": "https://tidelift.com/funding/github/npm/postcss"
-        }
-      ],
+    "node_modules/pkg-dir/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dev": true,
       "dependencies": {
-        "nanoid": "^3.3.4",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pkg-dir/node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dev": true,
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pkg-dir/node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dev": true,
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/pkg-dir/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dev": true,
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/png-js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
+      "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
+    },
+    "node_modules/postcss": {
+      "version": "8.4.21",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
+      "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.4",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
       },
       "engines": {
         "node": "^10 || ^12 || >=14"
       }
     },
     "node_modules/postcss-selector-parser": {
-      "version": "6.0.10",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
-      "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+      "version": "6.0.11",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
+      "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
       "dependencies": {
         "cssesc": "^3.0.0",
         "util-deprecate": "^1.0.2"
@@ -8029,30 +7941,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/prebuild-install/node_modules/simple-get": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
-      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "decompress-response": "^6.0.0",
-        "once": "^1.3.1",
-        "simple-concat": "^1.0.0"
-      }
-    },
     "node_modules/prelude-ls": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -8164,70 +8052,109 @@
       }
     },
     "node_modules/punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+      "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
       "engines": {
         "node": ">=6"
       }
     },
     "node_modules/puppeteer": {
-      "version": "19.5.2",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.5.2.tgz",
-      "integrity": "sha512-xlqRyrhXhVH114l79Y0XqYXUVG+Yfw4sKlvN55t8Y9DxtA5fzI1uqF8SVXbWK5DUMbD6Jo4lpixTZCTTZGD05g==",
+      "version": "19.7.4",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.7.4.tgz",
+      "integrity": "sha512-TdiNEG27BahPab4B/xfUth/L8yWV8ZT4D+/n01DWjK6pPQ2HgCGJGbL3dlSxUvor6dtxFBe16CEQ9JWXh0SCaQ==",
       "hasInstallScript": true,
       "dependencies": {
-        "cosmiconfig": "8.0.0",
+        "cosmiconfig": "8.1.0",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.5.2"
-      },
-      "engines": {
-        "node": ">=14.1.0"
+        "puppeteer-core": "19.7.4"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "19.5.2",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.5.2.tgz",
-      "integrity": "sha512-Rqk+3kqM+Z2deooTYqcYt8lRtGffJdifWa9td9nbJSjhANWsFouk8kLBNUKycewCCFHM8TZUKS0x28OllavW2A==",
+      "version": "19.7.4",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.7.4.tgz",
+      "integrity": "sha512-E8nVhqGF0ZM7s9pb5849gzKFG7282WYZaeGXo/eYDkpUpcPUgmkj7QrAoa8SpFXXyqHHilHJZPbfVBb4foDazQ==",
       "dependencies": {
+        "chromium-bidi": "0.4.4",
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
-        "devtools-protocol": "0.0.1068969",
+        "devtools-protocol": "0.0.1094867",
         "extract-zip": "2.0.1",
         "https-proxy-agent": "5.0.1",
         "proxy-from-env": "1.1.0",
-        "rimraf": "3.0.2",
+        "rimraf": "4.4.0",
         "tar-fs": "2.1.1",
         "unbzip2-stream": "1.4.3",
-        "ws": "8.11.0"
+        "ws": "8.12.1"
       },
       "engines": {
-        "node": ">=14.1.0"
+        "node": ">=14.14.0"
+      },
+      "peerDependencies": {
+        "typescript": ">= 4.7.4"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
       }
     },
-    "node_modules/puppeteer-core/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+    "node_modules/puppeteer-core/node_modules/glob": {
+      "version": "9.2.1",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-9.2.1.tgz",
+      "integrity": "sha512-Pxxgq3W0HyA3XUvSXcFhRSs+43Jsx0ddxcFrbjxNGkL2Ak5BAUBxLqI5G6ADDeCHLfzzXFhe0b1yYcctGmytMA==",
       "dependencies": {
-        "ms": "2.1.2"
+        "fs.realpath": "^1.0.0",
+        "minimatch": "^7.4.1",
+        "minipass": "^4.2.4",
+        "path-scurry": "^1.6.1"
       },
       "engines": {
-        "node": ">=6.0"
+        "node": ">=16 || 14 >=14.17"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/puppeteer-core/node_modules/rimraf": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
+      "integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
+      "dependencies": {
+        "glob": "^9.2.0"
+      },
+      "bin": {
+        "rimraf": "dist/cjs/src/bin.js"
+      },
+      "engines": {
+        "node": ">=14"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/puppeteer-core/node_modules/ws": {
+      "version": "8.12.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz",
+      "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
       },
       "peerDependenciesMeta": {
-        "supports-color": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
           "optional": true
         }
       }
     },
-    "node_modules/puppeteer-core/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
     "node_modules/pure-rand": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz",
@@ -8259,17 +8186,17 @@
       }
     },
     "node_modules/purgecss/node_modules/commander": {
-      "version": "9.4.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
-      "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==",
+      "version": "9.5.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+      "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
       "engines": {
         "node": "^12.20.0 || >=14"
       }
     },
     "node_modules/purgecss/node_modules/glob": {
-      "version": "8.0.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
-      "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+      "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -8285,9 +8212,9 @@
       }
     },
     "node_modules/purgecss/node_modules/minimatch": {
-      "version": "5.1.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
-      "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
+      "version": "5.1.6",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -8413,6 +8340,17 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/raw-body/node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/rc": {
       "version": "1.2.8",
       "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
@@ -8442,26 +8380,18 @@
       "dev": true
     },
     "node_modules/readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "optional": true,
+      "version": "3.6.2",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
       "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
       }
     },
-    "node_modules/readable-stream/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "optional": true
-    },
     "node_modules/readable-web-to-node-stream": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz",
@@ -8477,31 +8407,6 @@
         "url": "https://github.com/sponsors/Borewit"
       }
     },
-    "node_modules/readable-web-to-node-stream/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/regexpp": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
-      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/mysticatea"
-      }
-    },
     "node_modules/request": {
       "version": "2.88.2",
       "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
@@ -8570,6 +8475,16 @@
         "node": ">=0.8"
       }
     },
+    "node_modules/request/node_modules/uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
+      "optional": true,
+      "bin": {
+        "uuid": "bin/uuid"
+      }
+    },
     "node_modules/require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -8585,13 +8500,17 @@
       "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
     },
     "node_modules/resolve": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+      "version": "1.22.1",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
       "devOptional": true,
       "dependencies": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
+        "is-core-module": "^2.9.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
       },
       "funding": {
         "url": "https://github.com/sponsors/ljharb"
@@ -8680,6 +8599,7 @@
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
       "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "devOptional": true,
       "dependencies": {
         "glob": "^7.1.3"
       },
@@ -8695,6 +8615,11 @@
       "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz",
       "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g=="
     },
+    "node_modules/rrweb-cssom": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
+      "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw=="
+    },
     "node_modules/rss": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/rss/-/rss-1.2.2.tgz",
@@ -8714,6 +8639,14 @@
         "xml2js": "^0.4.19"
       }
     },
+    "node_modules/rss-parser/node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
     "node_modules/rss/node_modules/mime-db": {
       "version": "1.25.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz",
@@ -8774,9 +8707,9 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "node_modules/sanitize-html": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.1.tgz",
-      "integrity": "sha512-qK5neD0SaMxGwVv5txOYv05huC3o6ZAA4h5+7nJJgWMNFUNRjcjLO6FpwAtKzfKCZ0jrG6xTk6eVFskbvOGblg==",
+      "version": "2.10.0",
+      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.10.0.tgz",
+      "integrity": "sha512-JqdovUd81dG4k87vZt6uA6YhDfWkUGruUu/aPmXLxXi45gZExnt9Bnw/qeQU8oGf82vPyaE0vO4aH0PbobB9JQ==",
       "dependencies": {
         "deepmerge": "^4.2.2",
         "escape-string-regexp": "^4.0.0",
@@ -8791,23 +8724,29 @@
       "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
       "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
     },
+    "node_modules/saxes": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+      "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+      "dependencies": {
+        "xmlchars": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=v12.22.7"
+      }
+    },
     "node_modules/select": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
-      "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
+      "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
     },
     "node_modules/semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "devOptional": true,
       "bin": {
         "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
       }
     },
     "node_modules/send": {
@@ -8833,6 +8772,19 @@
         "node": ">= 0.8.0"
       }
     },
+    "node_modules/send/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/send/node_modules/debug/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
     "node_modules/send/node_modules/ms": {
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -8855,8 +8807,8 @@
     "node_modules/set-blocking": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "devOptional": true
+      "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+      "optional": true
     },
     "node_modules/setprototypeof": {
       "version": "1.2.0",
@@ -8891,30 +8843,36 @@
         "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/sharp/node_modules/simple-get": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
-      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
-      "dependencies": {
-        "decompress-response": "^6.0.0",
-        "once": "^1.3.1",
-        "simple-concat": "^1.0.0"
+    "node_modules/sharp/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/sharp/node_modules/semver": {
+      "version": "7.3.8",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
+    "node_modules/sharp/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -8949,14 +8907,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/side-channel/node_modules/object-inspect": {
-      "version": "1.12.2",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
-      "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
     "node_modules/signal-exit": {
       "version": "3.0.7",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
@@ -8983,44 +8933,33 @@
       ]
     },
     "node_modules/simple-get": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
-      "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
-      "optional": true,
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
       "dependencies": {
-        "decompress-response": "^4.2.0",
+        "decompress-response": "^6.0.0",
         "once": "^1.3.1",
         "simple-concat": "^1.0.0"
       }
     },
-    "node_modules/simple-get/node_modules/decompress-response": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
-      "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
-      "optional": true,
-      "dependencies": {
-        "mimic-response": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/simple-get/node_modules/mimic-response": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
-      "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
-      "optional": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/simple-git": {
-      "version": "3.16.0",
-      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz",
-      "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==",
+      "version": "3.17.0",
+      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.17.0.tgz",
+      "integrity": "sha512-JozI/s8jr3nvLd9yn2jzPVHnhVzt7t7QWfcIoDcqRIGN+f1IINGv52xoZti2kkYfoRhhRvzMSNPfogHMp97rlw==",
       "dependencies": {
         "@kwsites/file-exists": "^1.1.1",
         "@kwsites/promise-deferred": "^1.1.1",
@@ -9031,27 +8970,6 @@
         "url": "https://github.com/steveukx/git-js?sponsor=1"
       }
     },
-    "node_modules/simple-git/node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/simple-git/node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-    },
     "node_modules/simple-swizzle": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -9176,6 +9094,88 @@
         "escodegen": "^1.11.1"
       }
     },
+    "node_modules/static-eval/node_modules/escodegen": {
+      "version": "1.14.3",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
+      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+      "optional": true,
+      "dependencies": {
+        "esprima": "^4.0.1",
+        "estraverse": "^4.2.0",
+        "esutils": "^2.0.2",
+        "optionator": "^0.8.1"
+      },
+      "bin": {
+        "escodegen": "bin/escodegen.js",
+        "esgenerate": "bin/esgenerate.js"
+      },
+      "engines": {
+        "node": ">=4.0"
+      },
+      "optionalDependencies": {
+        "source-map": "~0.6.1"
+      }
+    },
+    "node_modules/static-eval/node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "optional": true,
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/static-eval/node_modules/levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+      "optional": true,
+      "dependencies": {
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/static-eval/node_modules/optionator": {
+      "version": "0.8.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
+      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+      "optional": true,
+      "dependencies": {
+        "deep-is": "~0.1.3",
+        "fast-levenshtein": "~2.0.6",
+        "levn": "~0.3.0",
+        "prelude-ls": "~1.1.2",
+        "type-check": "~0.3.2",
+        "word-wrap": "~1.2.3"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/static-eval/node_modules/prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+      "optional": true,
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/static-eval/node_modules/type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+      "optional": true,
+      "dependencies": {
+        "prelude-ls": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
     "node_modules/static-module": {
       "version": "2.2.5",
       "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz",
@@ -9198,6 +9198,12 @@
         "through2": "~2.0.3"
       }
     },
+    "node_modules/static-module/node_modules/convert-source-map": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+      "optional": true
+    },
     "node_modules/static-module/node_modules/escodegen": {
       "version": "1.9.1",
       "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
@@ -9242,6 +9248,12 @@
         "node": ">=4.0"
       }
     },
+    "node_modules/static-module/node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "optional": true
+    },
     "node_modules/static-module/node_modules/levn": {
       "version": "0.3.0",
       "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
@@ -9255,6 +9267,12 @@
         "node": ">= 0.8.0"
       }
     },
+    "node_modules/static-module/node_modules/object-inspect": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz",
+      "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==",
+      "optional": true
+    },
     "node_modules/static-module/node_modules/optionator": {
       "version": "0.8.3",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
@@ -9281,6 +9299,30 @@
         "node": ">= 0.8.0"
       }
     },
+    "node_modules/static-module/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "optional": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/static-module/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "optional": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/static-module/node_modules/type-check": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
@@ -9311,13 +9353,32 @@
       }
     },
     "node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
       "dependencies": {
-        "safe-buffer": "~5.1.0"
+        "safe-buffer": "~5.2.0"
       }
     },
+    "node_modules/string_decoder/node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
     "node_modules/string-length": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
@@ -9414,6 +9475,18 @@
         "node": ">=8"
       }
     },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "devOptional": true,
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/svgo": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz",
@@ -9443,20 +9516,20 @@
       "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
     },
     "node_modules/tar": {
-      "version": "6.1.11",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
-      "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
-      "devOptional": true,
+      "version": "6.1.13",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
+      "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
+      "optional": true,
       "dependencies": {
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
-        "minipass": "^3.0.0",
+        "minipass": "^4.0.0",
         "minizlib": "^2.1.1",
         "mkdirp": "^1.0.3",
         "yallist": "^4.0.0"
       },
       "engines": {
-        "node": ">= 10"
+        "node": ">=10"
       }
     },
     "node_modules/tar-fs": {
@@ -9490,30 +9563,11 @@
         "node": ">=6"
       }
     },
-    "node_modules/tar-stream/node_modules/readable-stream": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-      "dependencies": {
-        "inherits": "^2.0.3",
-        "string_decoder": "^1.1.1",
-        "util-deprecate": "^1.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/tar/node_modules/mkdirp": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-      "devOptional": true,
-      "bin": {
-        "mkdirp": "bin/cmd.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
+    "node_modules/tar/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "optional": true
     },
     "node_modules/test-exclude": {
       "version": "6.0.0",
@@ -9554,7 +9608,7 @@
     "node_modules/text-table": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
       "dev": true
     },
     "node_modules/through": {
@@ -9572,6 +9626,36 @@
         "xtend": "~4.0.1"
       }
     },
+    "node_modules/through2/node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+      "optional": true
+    },
+    "node_modules/through2/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "optional": true,
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/through2/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "optional": true,
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/tiny-emitter": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
@@ -9643,9 +9727,15 @@
       }
     },
     "node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
+      "integrity": "sha512-2lv/66T7e5yNyhAAC4NaKe5nVavzuGJQVVtRYLyQ2OI8tsJ61PMLlelehb0wi2Hx6+hT/OJUWZcw8MjlSRnxvw==",
+      "dependencies": {
+        "punycode": "^2.3.0"
+      },
+      "engines": {
+        "node": ">=14"
+      }
     },
     "node_modules/tunnel": {
       "version": "0.0.6",
@@ -9658,7 +9748,7 @@
     "node_modules/tunnel-agent": {
       "version": "0.6.0",
       "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
       "dependencies": {
         "safe-buffer": "^5.0.1"
       },
@@ -9761,7 +9851,7 @@
     "node_modules/unpipe": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
       "engines": {
         "node": ">= 0.8"
       }
@@ -9813,24 +9903,22 @@
     "node_modules/util-deprecate": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
     },
     "node_modules/utils-merge": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
       "engines": {
         "node": ">= 0.4.0"
       }
     },
     "node_modules/uuid": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
-      "optional": true,
+      "version": "8.3.2",
+      "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
       "bin": {
-        "uuid": "bin/uuid"
+        "uuid": "dist/bin/uuid"
       }
     },
     "node_modules/v8-to-istanbul": {
@@ -9847,10 +9935,16 @@
         "node": ">=10.12.0"
       }
     },
+    "node_modules/v8-to-istanbul/node_modules/convert-source-map": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+      "dev": true
+    },
     "node_modules/validator": {
-      "version": "13.7.0",
-      "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz",
-      "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==",
+      "version": "13.9.0",
+      "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz",
+      "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==",
       "engines": {
         "node": ">= 0.10"
       }
@@ -9858,7 +9952,7 @@
     "node_modules/vary": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
       "engines": {
         "node": ">= 0.8"
       }
@@ -9890,11 +9984,11 @@
       "optional": true
     },
     "node_modules/vue": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.1.tgz",
-      "integrity": "sha512-X1YkFddhbTAU2FPK0gBZ/vDOcOMA8ZT4uHoFVor1bUb7BpVGdEswS286YGtODsf/Ghfr1LM1sBMFAY8XT+dVhA==",
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz",
+      "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==",
       "dependencies": {
-        "@vue/compiler-sfc": "2.7.1",
+        "@vue/compiler-sfc": "2.7.14",
         "csstype": "^3.1.0"
       }
     },
@@ -9903,6 +9997,17 @@
       "resolved": "https://registry.npmjs.org/vue-prism-component/-/vue-prism-component-1.2.0.tgz",
       "integrity": "sha512-0N9CNuQu+36CJpdsZHrhdq7d18oBvjVMjawyKdIr8xuzFWLfdxECZQYbFaYoopPBg3SvkEEMtkhYqdgTQl5Y+A=="
     },
+    "node_modules/w3c-xmlserializer": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
+      "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
+      "dependencies": {
+        "xml-name-validator": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=14"
+      }
+    },
     "node_modules/walker": {
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
@@ -9913,9 +10018,9 @@
       }
     },
     "node_modules/web-streams-polyfill": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz",
-      "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q==",
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
+      "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
       "engines": {
         "node": ">= 8"
       }
@@ -9929,35 +10034,34 @@
       }
     },
     "node_modules/whatwg-encoding": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
-      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
-      "optional": true,
-      "dependencies": {
-        "iconv-lite": "0.4.24"
-      }
-    },
-    "node_modules/whatwg-url": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
-      "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+      "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
       "dependencies": {
-        "tr46": "^3.0.0",
-        "webidl-conversions": "^7.0.0"
+        "iconv-lite": "0.6.3"
       },
       "engines": {
         "node": ">=12"
       }
     },
-    "node_modules/whatwg-url/node_modules/tr46": {
+    "node_modules/whatwg-mimetype": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
-      "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+      "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+      "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/whatwg-url": {
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-12.0.1.tgz",
+      "integrity": "sha512-Ed/LrqB8EPlGxjS+TrsXcpUond1mhccS3pchLhzSgPCnTimUCKj3IZE75pAs5m6heB2U2TMerKFUXheyHY+VDQ==",
       "dependencies": {
-        "punycode": "^2.1.1"
+        "tr46": "^4.1.1",
+        "webidl-conversions": "^7.0.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=14"
       }
     },
     "node_modules/which": {
@@ -9979,7 +10083,7 @@
       "version": "1.1.5",
       "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
       "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
-      "devOptional": true,
+      "optional": true,
       "dependencies": {
         "string-width": "^1.0.2 || 2 || 3 || 4"
       }
@@ -10012,7 +10116,7 @@
     "node_modules/wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
     },
     "node_modules/write-file-atomic": {
       "version": "4.0.2",
@@ -10028,15 +10132,15 @@
       }
     },
     "node_modules/ws": {
-      "version": "8.11.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
-      "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
+      "version": "8.13.0",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
+      "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
       "engines": {
         "node": ">=10.0.0"
       },
       "peerDependencies": {
         "bufferutil": "^4.0.1",
-        "utf-8-validate": "^5.0.2"
+        "utf-8-validate": ">=5.0.2"
       },
       "peerDependenciesMeta": {
         "bufferutil": {
@@ -10054,11 +10158,11 @@
       "optional": true
     },
     "node_modules/xml-formatter": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-3.2.0.tgz",
-      "integrity": "sha512-PYROODIUDHz1SDFePg2VThajPOuSmvo/PrYRKARcSc9xxKKs62EN9uar60IIxxknzmOSNDAxlylpw34bQp0g/Q==",
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-3.3.2.tgz",
+      "integrity": "sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==",
       "dependencies": {
-        "xml-parser-xo": "^4.0.1"
+        "xml-parser-xo": "^4.0.3"
       },
       "engines": {
         "node": ">= 14"
@@ -10073,9 +10177,9 @@
       }
     },
     "node_modules/xml-parser-xo": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-4.0.1.tgz",
-      "integrity": "sha512-wJmRjzVZr7D+kYSajd3zqT7tt+y9L2vVWp+s7ARxzPMtk/gZcTY0KB14B801QX2D2wqIQ1d3bV/LgcnwlpKyyg==",
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-4.0.5.tgz",
+      "integrity": "sha512-UWXOHMQ4ySxpUiU3S/9KzPOhninlL8SN1xFfWgX9WjgoZWoLKtEeJIEz4jhKtdFsoZBCYjg9rDEP3qfnpiHagQ==",
       "engines": {
         "node": ">= 14"
       }
@@ -10124,9 +10228,10 @@
       }
     },
     "node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "dev": true
     },
     "node_modules/yargs": {
       "version": "17.7.1",
@@ -10176,7729 +10281,5 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     }
-  },
-  "dependencies": {
-    "@actions/core": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
-      "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
-      "requires": {
-        "@actions/http-client": "^2.0.1",
-        "uuid": "^8.3.2"
-      },
-      "dependencies": {
-        "uuid": {
-          "version": "8.3.2",
-          "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
-          "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
-        }
-      }
-    },
-    "@actions/github": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz",
-      "integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==",
-      "requires": {
-        "@actions/http-client": "^2.0.1",
-        "@octokit/core": "^3.6.0",
-        "@octokit/plugin-paginate-rest": "^2.17.0",
-        "@octokit/plugin-rest-endpoint-methods": "^5.13.0"
-      }
-    },
-    "@actions/http-client": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz",
-      "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==",
-      "requires": {
-        "tunnel": "^0.0.6"
-      }
-    },
-    "@ampproject/remapping": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
-      "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
-      "dev": true,
-      "requires": {
-        "@jridgewell/gen-mapping": "^0.1.0",
-        "@jridgewell/trace-mapping": "^0.3.9"
-      }
-    },
-    "@babel/code-frame": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
-      "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
-      "requires": {
-        "@babel/highlight": "^7.18.6"
-      }
-    },
-    "@babel/compat-data": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz",
-      "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==",
-      "dev": true
-    },
-    "@babel/core": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz",
-      "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==",
-      "dev": true,
-      "requires": {
-        "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.21.0",
-        "@babel/helper-compilation-targets": "^7.20.7",
-        "@babel/helper-module-transforms": "^7.21.0",
-        "@babel/helpers": "^7.21.0",
-        "@babel/parser": "^7.21.0",
-        "@babel/template": "^7.20.7",
-        "@babel/traverse": "^7.21.0",
-        "@babel/types": "^7.21.0",
-        "convert-source-map": "^1.7.0",
-        "debug": "^4.1.0",
-        "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.2",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/generator": {
-      "version": "7.21.1",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz",
-      "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.21.0",
-        "@jridgewell/gen-mapping": "^0.3.2",
-        "@jridgewell/trace-mapping": "^0.3.17",
-        "jsesc": "^2.5.1"
-      },
-      "dependencies": {
-        "@jridgewell/gen-mapping": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
-          "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
-          "dev": true,
-          "requires": {
-            "@jridgewell/set-array": "^1.0.1",
-            "@jridgewell/sourcemap-codec": "^1.4.10",
-            "@jridgewell/trace-mapping": "^0.3.9"
-          }
-        }
-      }
-    },
-    "@babel/helper-compilation-targets": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
-      "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
-      "dev": true,
-      "requires": {
-        "@babel/compat-data": "^7.20.5",
-        "@babel/helper-validator-option": "^7.18.6",
-        "browserslist": "^4.21.3",
-        "lru-cache": "^5.1.1",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "5.1.1",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-          "dev": true,
-          "requires": {
-            "yallist": "^3.0.2"
-          }
-        },
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        },
-        "yallist": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/helper-environment-visitor": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
-      "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
-      "dev": true
-    },
-    "@babel/helper-function-name": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
-      "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.20.7",
-        "@babel/types": "^7.21.0"
-      }
-    },
-    "@babel/helper-hoist-variables": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
-      "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.18.6"
-      }
-    },
-    "@babel/helper-module-imports": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
-      "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.18.6"
-      }
-    },
-    "@babel/helper-module-transforms": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
-      "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-module-imports": "^7.18.6",
-        "@babel/helper-simple-access": "^7.20.2",
-        "@babel/helper-split-export-declaration": "^7.18.6",
-        "@babel/helper-validator-identifier": "^7.19.1",
-        "@babel/template": "^7.20.7",
-        "@babel/traverse": "^7.21.2",
-        "@babel/types": "^7.21.2"
-      }
-    },
-    "@babel/helper-plugin-utils": {
-      "version": "7.20.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
-      "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
-      "dev": true
-    },
-    "@babel/helper-simple-access": {
-      "version": "7.20.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
-      "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.20.2"
-      }
-    },
-    "@babel/helper-split-export-declaration": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
-      "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.18.6"
-      }
-    },
-    "@babel/helper-string-parser": {
-      "version": "7.19.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
-      "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
-      "dev": true
-    },
-    "@babel/helper-validator-identifier": {
-      "version": "7.19.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
-      "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w=="
-    },
-    "@babel/helper-validator-option": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
-      "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
-      "dev": true
-    },
-    "@babel/helpers": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
-      "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.20.7",
-        "@babel/traverse": "^7.21.0",
-        "@babel/types": "^7.21.0"
-      }
-    },
-    "@babel/highlight": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
-      "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.18.6",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-          "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
-        },
-        "escape-string-regexp": {
-          "version": "1.0.5",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
-        },
-        "has-flag": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-          "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="
-        },
-        "supports-color": {
-          "version": "5.5.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
-      }
-    },
-    "@babel/parser": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz",
-      "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ=="
-    },
-    "@babel/plugin-syntax-async-generators": {
-      "version": "7.8.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
-      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-bigint": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
-      "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-class-properties": {
-      "version": "7.12.13",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
-      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.12.13"
-      }
-    },
-    "@babel/plugin-syntax-import-meta": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
-      "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-json-strings": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
-      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-jsx": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
-      "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.18.6"
-      }
-    },
-    "@babel/plugin-syntax-logical-assignment-operators": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
-      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-nullish-coalescing-operator": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
-      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-numeric-separator": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
-      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
-      }
-    },
-    "@babel/plugin-syntax-object-rest-spread": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
-      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-optional-catch-binding": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
-      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-optional-chaining": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
-      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.8.0"
-      }
-    },
-    "@babel/plugin-syntax-top-level-await": {
-      "version": "7.14.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
-      "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.14.5"
-      }
-    },
-    "@babel/plugin-syntax-typescript": {
-      "version": "7.20.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
-      "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.19.0"
-      }
-    },
-    "@babel/template": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
-      "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.18.6",
-        "@babel/parser": "^7.20.7",
-        "@babel/types": "^7.20.7"
-      }
-    },
-    "@babel/traverse": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz",
-      "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.21.1",
-        "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-function-name": "^7.21.0",
-        "@babel/helper-hoist-variables": "^7.18.6",
-        "@babel/helper-split-export-declaration": "^7.18.6",
-        "@babel/parser": "^7.21.2",
-        "@babel/types": "^7.21.2",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "globals": {
-          "version": "11.12.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-          "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-          "dev": true
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
-      }
-    },
-    "@babel/types": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz",
-      "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-string-parser": "^7.19.4",
-        "@babel/helper-validator-identifier": "^7.19.1",
-        "to-fast-properties": "^2.0.0"
-      }
-    },
-    "@bcoe/v8-coverage": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
-      "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
-      "dev": true
-    },
-    "@eslint/eslintrc": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz",
-      "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.12.4",
-        "debug": "^4.3.2",
-        "espree": "^9.4.0",
-        "globals": "^13.19.0",
-        "ignore": "^5.2.0",
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^4.1.0",
-        "minimatch": "^3.1.2",
-        "strip-json-comments": "^3.1.1"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "1.1.11",
-          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "minimatch": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-          "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
-      }
-    },
-    "@eslint/js": {
-      "version": "8.35.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz",
-      "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==",
-      "dev": true
-    },
-    "@faker-js/faker": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz",
-      "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw=="
-    },
-    "@github/auto-check-element": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@github/auto-check-element/-/auto-check-element-5.2.0.tgz",
-      "integrity": "sha512-YODZZUSeoZVJQ04p73MAohrEK37SJlVRDUTaFiPYse9K3z3bNEm+ekq5qYCIyDKGgX7hUhr3WZF35qHxr/zu0Q==",
-      "requires": {
-        "@github/mini-throttle": "^1.0.7"
-      },
-      "dependencies": {
-        "@github/mini-throttle": {
-          "version": "1.0.7",
-          "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-1.0.7.tgz",
-          "integrity": "sha512-1fzCDXpxI4J59pNmO0r0Y1g+R8Sa2B5ersce8AuFu5STMu7b++9osdedK0zWduYowBIgsPQZihJBN19WrAF64g=="
-        }
-      }
-    },
-    "@github/auto-complete-element": {
-      "version": "3.3.4",
-      "resolved": "https://registry.npmjs.org/@github/auto-complete-element/-/auto-complete-element-3.3.4.tgz",
-      "integrity": "sha512-b9SBCLIQGfCI3G0pGYE8rBSUDON5iFKUgHXgAtVdgZii0dnLFxNl5tn1R/RaBEFdzBQPDl9vqu41TF/Hs3w8FA==",
-      "requires": {
-        "@github/combobox-nav": "^2.0.2"
-      }
-    },
-    "@github/catalyst": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/@github/catalyst/-/catalyst-1.6.0.tgz",
-      "integrity": "sha512-u8A+DameixqpeyHzvnJWTGj+wfiskQOYHzSiJscCWVfMkIT3rxnbHMtGh3lMthaRY21nbUOK71WcsCnCrXhBJQ=="
-    },
-    "@github/clipboard-copy-element": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.1.2.tgz",
-      "integrity": "sha512-L6CMrcA5we0udafvoSuRCE/Ci/3xrLWKYRGup2IlhxF771bQYsQ2EB1of182pI8ZWM4oxgwzu37+igMeoZjN/A=="
-    },
-    "@github/combobox-nav": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@github/combobox-nav/-/combobox-nav-2.1.5.tgz",
-      "integrity": "sha512-dmG1PuppNKHnBBEcfylWDwj9SSxd/E/qd8mC1G/klQC3s7ps5q6JZ034mwkkG0LKfI+Y+UgEua/ROD776N400w=="
-    },
-    "@github/details-menu-element": {
-      "version": "1.0.13",
-      "resolved": "https://registry.npmjs.org/@github/details-menu-element/-/details-menu-element-1.0.13.tgz",
-      "integrity": "sha512-gMkii86w/oUP5dq8yOWZn1sgbgtFj3AYETxxtpsqRggZktgd8te4+npAn4Hm+936c/lxmEzXqfjARL/CzGR4+w=="
-    },
-    "@github/image-crop-element": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@github/image-crop-element/-/image-crop-element-5.0.0.tgz",
-      "integrity": "sha512-Vgm2OwWAs1ESoib/t5sjxsAYo6YTOxxAjWDRxswX7qrqoyCejTZ3hshdo4Ep5e+Mz/GVTZC3rdMtg06dk/eT4g=="
-    },
-    "@github/mini-throttle": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-2.1.0.tgz",
-      "integrity": "sha512-iEeR2OdVCPkdIPUszL8gJnKNu4MR8ANh7y0u/LPyaatYezgaWxUZEzhFntloqQq+HE6MZkFy+cl+xzCNuljOdw=="
-    },
-    "@github/relative-time-element": {
-      "version": "4.1.5",
-      "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.1.5.tgz",
-      "integrity": "sha512-WAf1EQV5Sn6jGuAIQur/ztKlEV9R+VHDNwqEbeaOb6s9fiwM5z7+ujlWNZtgFkDp3lF0H8D/f0vdiPlfHz0ZTQ=="
-    },
-    "@github/tab-container-element": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/@github/tab-container-element/-/tab-container-element-3.2.0.tgz",
-      "integrity": "sha512-to5ZJuywKK3KX53X1ifOcWjvUTQcBGdQ6Qkhm8L97xQ3ovICag1048M3YMpc+QSdr8xWeCBMnLeMnENqotB0Og=="
-    },
-    "@googlemaps/google-maps-services-js": {
-      "version": "3.3.26",
-      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.26.tgz",
-      "integrity": "sha512-/t0J/vLxPJcFsygSJU50WHgz2R3noAr7SkicthukD1HaEpMQ/O+llYt80R5yoO5cV9vMMDSqGUO7TvIEqiy3Ig==",
-      "optional": true,
-      "requires": {
-        "@googlemaps/url-signature": "^1.0.4",
-        "agentkeepalive": "^4.1.0",
-        "axios": "0.27.2",
-        "query-string": "7.1.3",
-        "retry-axios": "2.6.0"
-      },
-      "dependencies": {
-        "axios": {
-          "version": "0.27.2",
-          "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
-          "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
-          "optional": true,
-          "requires": {
-            "follow-redirects": "^1.14.9",
-            "form-data": "^4.0.0"
-          }
-        }
-      }
-    },
-    "@googlemaps/url-signature": {
-      "version": "1.0.25",
-      "resolved": "https://registry.npmjs.org/@googlemaps/url-signature/-/url-signature-1.0.25.tgz",
-      "integrity": "sha512-gc91DO9GRrcOdlKRes42+bMb45TuDxAEPrdARClCuGkkdWyb2dG/x+9fs63FTFf0Y26Q+bDNcQLID+TA37vn8Q==",
-      "optional": true,
-      "requires": {
-        "crypto-js": "^4.1.1"
-      }
-    },
-    "@humanwhocodes/config-array": {
-      "version": "0.11.8",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
-      "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
-      "dev": true,
-      "requires": {
-        "@humanwhocodes/object-schema": "^1.2.1",
-        "debug": "^4.1.1",
-        "minimatch": "^3.0.5"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "1.1.11",
-          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "minimatch": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-          "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
-      }
-    },
-    "@humanwhocodes/module-importer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
-      "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
-      "dev": true
-    },
-    "@humanwhocodes/object-schema": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
-      "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
-      "dev": true
-    },
-    "@istanbuljs/load-nyc-config": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
-      "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.3.1",
-        "find-up": "^4.1.0",
-        "get-package-type": "^0.1.0",
-        "js-yaml": "^3.13.1",
-        "resolve-from": "^5.0.0"
-      },
-      "dependencies": {
-        "argparse": {
-          "version": "1.0.10",
-          "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-          "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-          "dev": true,
-          "requires": {
-            "sprintf-js": "~1.0.2"
-          }
-        },
-        "js-yaml": {
-          "version": "3.14.1",
-          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-          "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
-          "dev": true,
-          "requires": {
-            "argparse": "^1.0.7",
-            "esprima": "^4.0.0"
-          }
-        },
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-          "dev": true
-        },
-        "sprintf-js": {
-          "version": "1.0.3",
-          "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-          "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
-          "dev": true
-        }
-      }
-    },
-    "@istanbuljs/schema": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
-      "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
-      "dev": true
-    },
-    "@jest/console": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz",
-      "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^29.5.0",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "jest-message-util": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "slash": "^3.0.0"
-      }
-    },
-    "@jest/core": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz",
-      "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^29.5.0",
-        "@jest/reporters": "^29.5.0",
-        "@jest/test-result": "^29.5.0",
-        "@jest/transform": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "ci-info": "^3.2.0",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.9",
-        "jest-changed-files": "^29.5.0",
-        "jest-config": "^29.5.0",
-        "jest-haste-map": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-regex-util": "^29.4.3",
-        "jest-resolve": "^29.5.0",
-        "jest-resolve-dependencies": "^29.5.0",
-        "jest-runner": "^29.5.0",
-        "jest-runtime": "^29.5.0",
-        "jest-snapshot": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "jest-validate": "^29.5.0",
-        "jest-watcher": "^29.5.0",
-        "micromatch": "^4.0.4",
-        "pretty-format": "^29.5.0",
-        "slash": "^3.0.0",
-        "strip-ansi": "^6.0.0"
-      }
-    },
-    "@jest/environment": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz",
-      "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==",
-      "dev": true,
-      "requires": {
-        "@jest/fake-timers": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@types/node": "*",
-        "jest-mock": "^29.5.0"
-      }
-    },
-    "@jest/expect": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz",
-      "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==",
-      "dev": true,
-      "requires": {
-        "expect": "^29.5.0",
-        "jest-snapshot": "^29.5.0"
-      }
-    },
-    "@jest/expect-utils": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz",
-      "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==",
-      "dev": true,
-      "requires": {
-        "jest-get-type": "^29.4.3"
-      }
-    },
-    "@jest/fake-timers": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz",
-      "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^29.5.0",
-        "@sinonjs/fake-timers": "^10.0.2",
-        "@types/node": "*",
-        "jest-message-util": "^29.5.0",
-        "jest-mock": "^29.5.0",
-        "jest-util": "^29.5.0"
-      }
-    },
-    "@jest/globals": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz",
-      "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^29.5.0",
-        "@jest/expect": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "jest-mock": "^29.5.0"
-      }
-    },
-    "@jest/reporters": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz",
-      "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==",
-      "dev": true,
-      "requires": {
-        "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^29.5.0",
-        "@jest/test-result": "^29.5.0",
-        "@jest/transform": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@jridgewell/trace-mapping": "^0.3.15",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "collect-v8-coverage": "^1.0.0",
-        "exit": "^0.1.2",
-        "glob": "^7.1.3",
-        "graceful-fs": "^4.2.9",
-        "istanbul-lib-coverage": "^3.0.0",
-        "istanbul-lib-instrument": "^5.1.0",
-        "istanbul-lib-report": "^3.0.0",
-        "istanbul-lib-source-maps": "^4.0.0",
-        "istanbul-reports": "^3.1.3",
-        "jest-message-util": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "jest-worker": "^29.5.0",
-        "slash": "^3.0.0",
-        "string-length": "^4.0.1",
-        "strip-ansi": "^6.0.0",
-        "v8-to-istanbul": "^9.0.1"
-      }
-    },
-    "@jest/schemas": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
-      "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
-      "dev": true,
-      "requires": {
-        "@sinclair/typebox": "^0.25.16"
-      }
-    },
-    "@jest/source-map": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz",
-      "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==",
-      "dev": true,
-      "requires": {
-        "@jridgewell/trace-mapping": "^0.3.15",
-        "callsites": "^3.0.0",
-        "graceful-fs": "^4.2.9"
-      }
-    },
-    "@jest/test-result": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz",
-      "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "collect-v8-coverage": "^1.0.0"
-      }
-    },
-    "@jest/test-sequencer": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz",
-      "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==",
-      "dev": true,
-      "requires": {
-        "@jest/test-result": "^29.5.0",
-        "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.5.0",
-        "slash": "^3.0.0"
-      }
-    },
-    "@jest/transform": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz",
-      "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.11.6",
-        "@jest/types": "^29.5.0",
-        "@jridgewell/trace-mapping": "^0.3.15",
-        "babel-plugin-istanbul": "^6.1.1",
-        "chalk": "^4.0.0",
-        "convert-source-map": "^2.0.0",
-        "fast-json-stable-stringify": "^2.1.0",
-        "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.5.0",
-        "jest-regex-util": "^29.4.3",
-        "jest-util": "^29.5.0",
-        "micromatch": "^4.0.4",
-        "pirates": "^4.0.4",
-        "slash": "^3.0.0",
-        "write-file-atomic": "^4.0.2"
-      },
-      "dependencies": {
-        "convert-source-map": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
-          "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
-          "dev": true
-        }
-      }
-    },
-    "@jest/types": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz",
-      "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==",
-      "dev": true,
-      "requires": {
-        "@jest/schemas": "^29.4.3",
-        "@types/istanbul-lib-coverage": "^2.0.0",
-        "@types/istanbul-reports": "^3.0.0",
-        "@types/node": "*",
-        "@types/yargs": "^17.0.8",
-        "chalk": "^4.0.0"
-      }
-    },
-    "@jridgewell/gen-mapping": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
-      "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
-      "dev": true,
-      "requires": {
-        "@jridgewell/set-array": "^1.0.0",
-        "@jridgewell/sourcemap-codec": "^1.4.10"
-      }
-    },
-    "@jridgewell/resolve-uri": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
-      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
-      "dev": true
-    },
-    "@jridgewell/set-array": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
-      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
-      "dev": true
-    },
-    "@jridgewell/sourcemap-codec": {
-      "version": "1.4.14",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
-      "dev": true
-    },
-    "@jridgewell/trace-mapping": {
-      "version": "0.3.17",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
-      "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
-      "dev": true,
-      "requires": {
-        "@jridgewell/resolve-uri": "3.1.0",
-        "@jridgewell/sourcemap-codec": "1.4.14"
-      }
-    },
-    "@kwsites/file-exists": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
-      "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
-      "requires": {
-        "debug": "^4.1.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        }
-      }
-    },
-    "@kwsites/promise-deferred": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
-      "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="
-    },
-    "@mapbox/node-pre-gyp": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz",
-      "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==",
-      "devOptional": true,
-      "requires": {
-        "detect-libc": "^2.0.0",
-        "https-proxy-agent": "^5.0.0",
-        "make-dir": "^3.1.0",
-        "node-fetch": "^2.6.7",
-        "nopt": "^5.0.0",
-        "npmlog": "^5.0.1",
-        "rimraf": "^3.0.2",
-        "semver": "^7.3.5",
-        "tar": "^6.1.11"
-      },
-      "dependencies": {
-        "node-fetch": {
-          "version": "2.6.7",
-          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-          "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-          "devOptional": true,
-          "requires": {
-            "whatwg-url": "^5.0.0"
-          }
-        },
-        "webidl-conversions": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-          "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
-          "devOptional": true
-        },
-        "whatwg-url": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-          "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
-          "devOptional": true,
-          "requires": {
-            "tr46": "~0.0.3",
-            "webidl-conversions": "^3.0.0"
-          }
-        }
-      }
-    },
-    "@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      }
-    },
-    "@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
-      "dev": true
-    },
-    "@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
-      "dev": true,
-      "requires": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
-      }
-    },
-    "@octokit/auth-token": {
-      "version": "2.4.5",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz",
-      "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==",
-      "requires": {
-        "@octokit/types": "^6.0.3"
-      }
-    },
-    "@octokit/core": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
-      "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
-      "requires": {
-        "@octokit/auth-token": "^2.4.4",
-        "@octokit/graphql": "^4.5.8",
-        "@octokit/request": "^5.6.3",
-        "@octokit/request-error": "^2.0.5",
-        "@octokit/types": "^6.0.3",
-        "before-after-hook": "^2.2.0",
-        "universal-user-agent": "^6.0.0"
-      },
-      "dependencies": {
-        "@octokit/graphql": {
-          "version": "4.8.0",
-          "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
-          "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
-          "requires": {
-            "@octokit/request": "^5.6.0",
-            "@octokit/types": "^6.0.3",
-            "universal-user-agent": "^6.0.0"
-          }
-        }
-      }
-    },
-    "@octokit/endpoint": {
-      "version": "6.0.12",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
-      "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
-      "requires": {
-        "@octokit/types": "^6.0.3",
-        "is-plain-object": "^5.0.0",
-        "universal-user-agent": "^6.0.0"
-      }
-    },
-    "@octokit/graphql": {
-      "version": "5.0.4",
-      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz",
-      "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==",
-      "requires": {
-        "@octokit/request": "^6.0.0",
-        "@octokit/types": "^8.0.0",
-        "universal-user-agent": "^6.0.0"
-      },
-      "dependencies": {
-        "@octokit/endpoint": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.0.tgz",
-          "integrity": "sha512-Kz/mIkOTjs9rV50hf/JK9pIDl4aGwAtT8pry6Rpy+hVXkAPhXanNQRxMoq6AeRgDCZR6t/A1zKniY2V1YhrzlQ==",
-          "requires": {
-            "@octokit/types": "^6.0.3",
-            "is-plain-object": "^5.0.0",
-            "universal-user-agent": "^6.0.0"
-          },
-          "dependencies": {
-            "@octokit/openapi-types": {
-              "version": "12.11.0",
-              "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
-              "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
-            },
-            "@octokit/types": {
-              "version": "6.41.0",
-              "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
-              "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
-              "requires": {
-                "@octokit/openapi-types": "^12.11.0"
-              }
-            }
-          }
-        },
-        "@octokit/openapi-types": {
-          "version": "14.0.0",
-          "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz",
-          "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw=="
-        },
-        "@octokit/request": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.1.0.tgz",
-          "integrity": "sha512-36V+sP4bJli31TRq8sea3d/Q1XGgZ9cnqpsegkLCnvpu+hoYephSkxGlWg4KB6dyUM1IWPXVrLFOKYzObQ+MZg==",
-          "requires": {
-            "@octokit/endpoint": "^7.0.0",
-            "@octokit/request-error": "^3.0.0",
-            "@octokit/types": "^6.16.1",
-            "is-plain-object": "^5.0.0",
-            "node-fetch": "^2.6.7",
-            "universal-user-agent": "^6.0.0"
-          },
-          "dependencies": {
-            "@octokit/openapi-types": {
-              "version": "12.11.0",
-              "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
-              "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
-            },
-            "@octokit/types": {
-              "version": "6.41.0",
-              "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
-              "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
-              "requires": {
-                "@octokit/openapi-types": "^12.11.0"
-              }
-            }
-          }
-        },
-        "@octokit/request-error": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.0.tgz",
-          "integrity": "sha512-WBtpzm9lR8z4IHIMtOqr6XwfkGvMOOILNLxsWvDwtzm/n7f5AWuqJTXQXdDtOvPfTDrH4TPhEvW2qMlR4JFA2w==",
-          "requires": {
-            "@octokit/types": "^6.0.3",
-            "deprecation": "^2.0.0",
-            "once": "^1.4.0"
-          },
-          "dependencies": {
-            "@octokit/openapi-types": {
-              "version": "12.11.0",
-              "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
-              "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
-            },
-            "@octokit/types": {
-              "version": "6.41.0",
-              "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
-              "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
-              "requires": {
-                "@octokit/openapi-types": "^12.11.0"
-              }
-            }
-          }
-        },
-        "@octokit/types": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.0.0.tgz",
-          "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==",
-          "requires": {
-            "@octokit/openapi-types": "^14.0.0"
-          }
-        },
-        "node-fetch": {
-          "version": "2.6.7",
-          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-          "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-          "requires": {
-            "whatwg-url": "^5.0.0"
-          }
-        },
-        "webidl-conversions": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-          "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-        },
-        "whatwg-url": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-          "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-          "requires": {
-            "tr46": "~0.0.3",
-            "webidl-conversions": "^3.0.0"
-          }
-        }
-      }
-    },
-    "@octokit/openapi-types": {
-      "version": "12.8.0",
-      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.8.0.tgz",
-      "integrity": "sha512-ydcKLs2KKcxlhpdWLzJxEBDEk/U5MUeqtqkXlrtAUXXFPs6vLl1PEGghFC/BbpleosB7iXs0Z4P2DGe7ZT5ZNg=="
-    },
-    "@octokit/plugin-paginate-rest": {
-      "version": "2.17.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz",
-      "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==",
-      "requires": {
-        "@octokit/types": "^6.34.0"
-      }
-    },
-    "@octokit/plugin-request-log": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
-      "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
-      "requires": {}
-    },
-    "@octokit/plugin-rest-endpoint-methods": {
-      "version": "5.13.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz",
-      "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==",
-      "requires": {
-        "@octokit/types": "^6.34.0",
-        "deprecation": "^2.3.1"
-      }
-    },
-    "@octokit/request": {
-      "version": "5.6.3",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
-      "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
-      "requires": {
-        "@octokit/endpoint": "^6.0.1",
-        "@octokit/request-error": "^2.1.0",
-        "@octokit/types": "^6.16.1",
-        "is-plain-object": "^5.0.0",
-        "node-fetch": "^2.6.7",
-        "universal-user-agent": "^6.0.0"
-      },
-      "dependencies": {
-        "node-fetch": {
-          "version": "2.6.7",
-          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-          "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-          "requires": {
-            "whatwg-url": "^5.0.0"
-          }
-        },
-        "webidl-conversions": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-          "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
-        },
-        "whatwg-url": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-          "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
-          "requires": {
-            "tr46": "~0.0.3",
-            "webidl-conversions": "^3.0.0"
-          }
-        }
-      }
-    },
-    "@octokit/request-error": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
-      "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
-      "requires": {
-        "@octokit/types": "^6.0.3",
-        "deprecation": "^2.0.0",
-        "once": "^1.4.0"
-      }
-    },
-    "@octokit/rest": {
-      "version": "19.0.5",
-      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz",
-      "integrity": "sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==",
-      "requires": {
-        "@octokit/core": "^4.1.0",
-        "@octokit/plugin-paginate-rest": "^5.0.0",
-        "@octokit/plugin-request-log": "^1.0.4",
-        "@octokit/plugin-rest-endpoint-methods": "^6.7.0"
-      },
-      "dependencies": {
-        "@octokit/auth-token": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz",
-          "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==",
-          "requires": {
-            "@octokit/types": "^8.0.0"
-          }
-        },
-        "@octokit/core": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz",
-          "integrity": "sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==",
-          "requires": {
-            "@octokit/auth-token": "^3.0.0",
-            "@octokit/graphql": "^5.0.0",
-            "@octokit/request": "^6.0.0",
-            "@octokit/request-error": "^3.0.0",
-            "@octokit/types": "^8.0.0",
-            "before-after-hook": "^2.2.0",
-            "universal-user-agent": "^6.0.0"
-          }
-        },
-        "@octokit/endpoint": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz",
-          "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==",
-          "requires": {
-            "@octokit/types": "^8.0.0",
-            "is-plain-object": "^5.0.0",
-            "universal-user-agent": "^6.0.0"
-          }
-        },
-        "@octokit/openapi-types": {
-          "version": "14.0.0",
-          "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz",
-          "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw=="
-        },
-        "@octokit/plugin-paginate-rest": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz",
-          "integrity": "sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==",
-          "requires": {
-            "@octokit/types": "^8.0.0"
-          }
-        },
-        "@octokit/plugin-rest-endpoint-methods": {
-          "version": "6.7.0",
-          "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz",
-          "integrity": "sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==",
-          "requires": {
-            "@octokit/types": "^8.0.0",
-            "deprecation": "^2.3.1"
-          }
-        },
-        "@octokit/request": {
-          "version": "6.2.2",
-          "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz",
-          "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==",
-          "requires": {
-            "@octokit/endpoint": "^7.0.0",
-            "@octokit/request-error": "^3.0.0",
-            "@octokit/types": "^8.0.0",
-            "is-plain-object": "^5.0.0",
-            "node-fetch": "^2.6.7",
-            "universal-user-agent": "^6.0.0"
-          }
-        },
-        "@octokit/request-error": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz",
-          "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==",
-          "requires": {
-            "@octokit/types": "^8.0.0",
-            "deprecation": "^2.0.0",
-            "once": "^1.4.0"
-          }
-        },
-        "@octokit/types": {
-          "version": "8.0.0",
-          "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.0.0.tgz",
-          "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==",
-          "requires": {
-            "@octokit/openapi-types": "^14.0.0"
-          }
-        },
-        "node-fetch": {
-          "version": "2.6.7",
-          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-          "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-          "requires": {
-            "whatwg-url": "^5.0.0"
-          }
-        },
-        "webidl-conversions": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-          "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-        },
-        "whatwg-url": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-          "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-          "requires": {
-            "tr46": "~0.0.3",
-            "webidl-conversions": "^3.0.0"
-          }
-        }
-      }
-    },
-    "@octokit/types": {
-      "version": "6.39.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.39.0.tgz",
-      "integrity": "sha512-Mq4N9sOAYCitTsBtDdRVrBE80lIrMBhL9Jbrw0d+j96BAzlq4V+GLHFJbHokEsVvO/9tQupQdoFdgVYhD2C8UQ==",
-      "requires": {
-        "@octokit/openapi-types": "^12.7.0"
-      }
-    },
-    "@panosoft/ramda-utils": {
-      "version": "0.2.8",
-      "resolved": "https://registry.npmjs.org/@panosoft/ramda-utils/-/ramda-utils-0.2.8.tgz",
-      "integrity": "sha512-lUou1P0vUiWt40AjhjYLwh0SN/3DNnsb+GM3xiqz6tPoMnv9+LjPxe7XYKKPcGnfqurtnUEJbkJR+RKed2/qiw==",
-      "optional": true,
-      "requires": {
-        "is_js": "^0.7.4",
-        "ramda": "^0.18.0"
-      },
-      "dependencies": {
-        "is_js": {
-          "version": "0.7.6",
-          "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.7.6.tgz",
-          "integrity": "sha512-VEd4A7sAneA4qWlrwdTT3WyodlfpSXZIyMYNpf8SA4Q1zOH4+1O2X5LuARQGBqCUDpG9SxDHV03ZLNUIg3xS1g==",
-          "optional": true
-        }
-      }
-    },
-    "@primer/behaviors": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.1.tgz",
-      "integrity": "sha512-aMRDUQ350lk0FxtL5gJWPFHHOSSzDbJ6uNJVIt8XSqiGe1pxuW5mVVfrEp1uvzZ0pCHkCdm9fycjnfOeMeIrOQ=="
-    },
-    "@primer/css": {
-      "version": "20.8.0",
-      "resolved": "https://registry.npmjs.org/@primer/css/-/css-20.8.0.tgz",
-      "integrity": "sha512-ybrROX5Qaurqidl4QlSC7AwZ1fTKODlQQDkncOXzHoFM0xe2aMH4zvGXz79Cz2W1sdJ4kpa8dsGqfkkcXbjalQ==",
-      "requires": {
-        "@primer/primitives": "^7.9.0",
-        "@primer/view-components": "^0.0.115"
-      }
-    },
-    "@primer/octicons": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-18.2.0.tgz",
-      "integrity": "sha512-Bx7PkGZUgbo/xbZSdufxKefg5JzvGPkIu/x93TAiWit+FoPBmLammqfHQe1Y5gmT2AWAuxJUksYN05hi7w6VnA==",
-      "requires": {
-        "object-assign": "^4.1.1"
-      }
-    },
-    "@primer/primitives": {
-      "version": "7.9.0",
-      "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.9.0.tgz",
-      "integrity": "sha512-ZHHfwB0z0z6nDJp263gyGIClYDy+rl0nwqyi4qhcv3Cxhkmtf+If2KVjr6FQqBBFfi1wQwUzaax2FBvfEMFBnw=="
-    },
-    "@primer/view-components": {
-      "version": "0.0.115",
-      "resolved": "https://registry.npmjs.org/@primer/view-components/-/view-components-0.0.115.tgz",
-      "integrity": "sha512-Qo6vNE0/UK6azsu9wTpb9AneHpM2FkA/saZ6UB1kvRttD5M0d/xto8sqq6b45QkKukqIlS4MhzyyvLIvC6rI1g==",
-      "requires": {
-        "@github/auto-check-element": "^5.2.0",
-        "@github/auto-complete-element": "^3.3.4",
-        "@github/catalyst": "^1.6.0",
-        "@github/clipboard-copy-element": "^1.1.2",
-        "@github/details-menu-element": "^1.0.12",
-        "@github/image-crop-element": "^5.0.0",
-        "@github/mini-throttle": "^2.1.0",
-        "@github/relative-time-element": "^4.0.0",
-        "@github/tab-container-element": "^3.1.2",
-        "@primer/behaviors": "^1.2.0"
-      }
-    },
-    "@sinclair/typebox": {
-      "version": "0.25.24",
-      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
-      "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
-      "dev": true
-    },
-    "@sindresorhus/is": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz",
-      "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw=="
-    },
-    "@sinonjs/commons": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
-      "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
-      "dev": true,
-      "requires": {
-        "type-detect": "4.0.8"
-      }
-    },
-    "@sinonjs/fake-timers": {
-      "version": "10.0.2",
-      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz",
-      "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==",
-      "dev": true,
-      "requires": {
-        "@sinonjs/commons": "^2.0.0"
-      }
-    },
-    "@szmarczak/http-timer": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
-      "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
-      "requires": {
-        "defer-to-connect": "^2.0.1"
-      }
-    },
-    "@tokenizer/token": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
-      "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="
-    },
-    "@trysound/sax": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
-      "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="
-    },
-    "@twemoji/parser": {
-      "version": "14.1.0",
-      "resolved": "https://registry.npmjs.org/@twemoji/parser/-/parser-14.1.0.tgz",
-      "integrity": "sha512-psQR5WEZjqSFy1gxJKpiMR9ygy59jykqIAAON8Xir78t9+E4z6S/BwYsksbylzJB1nCHKLzvkROrUHk2DKnEbg=="
-    },
-    "@types/babel__core": {
-      "version": "7.20.0",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
-      "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
-      "dev": true,
-      "requires": {
-        "@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.4",
-      "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
-      "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@types/babel__template": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz",
-      "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==",
-      "dev": true,
-      "requires": {
-        "@babel/parser": "^7.1.0",
-        "@babel/types": "^7.0.0"
-      }
-    },
-    "@types/babel__traverse": {
-      "version": "7.18.3",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
-      "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.3.0"
-      }
-    },
-    "@types/graceful-fs": {
-      "version": "4.1.6",
-      "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
-      "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@types/http-cache-semantics": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
-      "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
-    },
-    "@types/istanbul-lib-coverage": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
-      "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
-      "dev": true
-    },
-    "@types/istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-coverage": "*"
-      }
-    },
-    "@types/istanbul-reports": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz",
-      "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==",
-      "dev": true,
-      "requires": {
-        "@types/istanbul-lib-report": "*"
-      }
-    },
-    "@types/node": {
-      "version": "15.12.2",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-15.12.2.tgz",
-      "integrity": "sha512-zjQ69G564OCIWIOHSXyQEEDpdpGl+G348RAKY0XXy9Z5kU9Vzv1GMNnkar/ZJ8dzXB3COzD9Mo9NtRZ4xfgUww==",
-      "devOptional": true
-    },
-    "@types/prettier": {
-      "version": "2.7.2",
-      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
-      "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
-      "dev": true
-    },
-    "@types/stack-utils": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
-      "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==",
-      "dev": true
-    },
-    "@types/yargs": {
-      "version": "17.0.22",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz",
-      "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==",
-      "dev": true,
-      "requires": {
-        "@types/yargs-parser": "*"
-      }
-    },
-    "@types/yargs-parser": {
-      "version": "21.0.0",
-      "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz",
-      "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==",
-      "dev": true
-    },
-    "@types/yauzl": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
-      "optional": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@vue/compiler-sfc": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.1.tgz",
-      "integrity": "sha512-YQRE2uYhlvyFgHmKAqySCdLm7O37XZc+yG9dujwD3h8em+rD1qGOthxc0H3XcijOy50gj/pYHgBO6C3MjV+oug==",
-      "requires": {
-        "@babel/parser": "^7.18.4",
-        "postcss": "^8.4.14",
-        "source-map": "^0.6.1"
-      }
-    },
-    "abab": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
-      "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA=="
-    },
-    "abbrev": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
-      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
-      "devOptional": true
-    },
-    "accepts": {
-      "version": "1.3.8",
-      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
-      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
-      "requires": {
-        "mime-types": "~2.1.34",
-        "negotiator": "0.6.3"
-      }
-    },
-    "acorn": {
-      "version": "8.8.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz",
-      "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA=="
-    },
-    "acorn-globals": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
-      "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
-      "requires": {
-        "acorn": "^8.1.0",
-        "acorn-walk": "^8.0.2"
-      },
-      "dependencies": {
-        "acorn-walk": {
-          "version": "8.2.0",
-          "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
-          "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA=="
-        }
-      }
-    },
-    "acorn-jsx": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
-      "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
-      "dev": true,
-      "requires": {}
-    },
-    "agent-base": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
-      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
-      "requires": {
-        "debug": "4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        }
-      }
-    },
-    "agentkeepalive": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz",
-      "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==",
-      "optional": true,
-      "requires": {
-        "debug": "^4.1.0",
-        "depd": "^1.1.2",
-        "humanize-ms": "^1.2.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "optional": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "depd": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
-          "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
-          "optional": true
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "optional": true
-        }
-      }
-    },
-    "ajv": {
-      "version": "6.12.6",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
-      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "devOptional": true,
-      "requires": {
-        "fast-deep-equal": "^3.1.1",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.4.1",
-        "uri-js": "^4.2.2"
-      }
-    },
-    "ansi-escapes": {
-      "version": "4.3.2",
-      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
-      "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
-      "dev": true,
-      "requires": {
-        "type-fest": "^0.21.3"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "0.21.3",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
-          "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
-          "dev": true
-        }
-      }
-    },
-    "ansi-regex": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
-      "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "devOptional": true
-    },
-    "ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "requires": {
-        "color-convert": "^2.0.1"
-      }
-    },
-    "anymatch": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
-      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
-      "dev": true,
-      "requires": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      }
-    },
-    "aproba": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
-      "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
-      "devOptional": true
-    },
-    "are-we-there-yet": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
-      "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
-      "devOptional": true,
-      "requires": {
-        "delegates": "^1.0.0",
-        "readable-stream": "^3.6.0"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.6.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-          "devOptional": true,
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        }
-      }
-    },
-    "argparse": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
-      "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
-    },
-    "array-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
-      "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==",
-      "optional": true
-    },
-    "array-flatten": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
-      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
-    },
-    "asap": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
-      "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
-      "optional": true
-    },
-    "asn1": {
-      "version": "0.2.6",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
-      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
-      "optional": true,
-      "requires": {
-        "safer-buffer": "~2.1.0"
-      }
-    },
-    "assert-plus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
-      "optional": true
-    },
-    "async": {
-      "version": "3.2.3",
-      "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
-      "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
-    },
-    "aws-sign2": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
-      "optional": true
-    },
-    "aws4": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
-      "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
-      "optional": true
-    },
-    "axios": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.2.2.tgz",
-      "integrity": "sha512-bz/J4gS2S3I7mpN/YZfGFTqhXTYzRho8Ay38w2otuuDR322KzFIWm/4W2K6gIwvWaws5n+mnb7D1lN9uD+QH6Q==",
-      "requires": {
-        "follow-redirects": "^1.15.0",
-        "form-data": "^4.0.0",
-        "proxy-from-env": "^1.1.0"
-      }
-    },
-    "babel-jest": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz",
-      "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==",
-      "dev": true,
-      "requires": {
-        "@jest/transform": "^29.5.0",
-        "@types/babel__core": "^7.1.14",
-        "babel-plugin-istanbul": "^6.1.1",
-        "babel-preset-jest": "^29.5.0",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.9",
-        "slash": "^3.0.0"
-      }
-    },
-    "babel-plugin-istanbul": {
-      "version": "6.1.1",
-      "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
-      "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
-      "dev": true,
-      "requires": {
-        "@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": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz",
-      "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.3.3",
-        "@babel/types": "^7.3.3",
-        "@types/babel__core": "^7.1.14",
-        "@types/babel__traverse": "^7.0.6"
-      }
-    },
-    "babel-preset-current-node-syntax": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
-      "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==",
-      "dev": true,
-      "requires": {
-        "@babel/plugin-syntax-async-generators": "^7.8.4",
-        "@babel/plugin-syntax-bigint": "^7.8.3",
-        "@babel/plugin-syntax-class-properties": "^7.8.3",
-        "@babel/plugin-syntax-import-meta": "^7.8.3",
-        "@babel/plugin-syntax-json-strings": "^7.8.3",
-        "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
-        "@babel/plugin-syntax-numeric-separator": "^7.8.3",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
-        "@babel/plugin-syntax-top-level-await": "^7.8.3"
-      }
-    },
-    "babel-preset-jest": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz",
-      "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==",
-      "dev": true,
-      "requires": {
-        "babel-plugin-jest-hoist": "^29.5.0",
-        "babel-preset-current-node-syntax": "^1.0.0"
-      }
-    },
-    "balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
-    },
-    "base64-js": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
-    },
-    "bcrypt-pbkdf": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
-      "optional": true,
-      "requires": {
-        "tweetnacl": "^0.14.3"
-      }
-    },
-    "before-after-hook": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
-      "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ=="
-    },
-    "binary-extensions": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
-      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
-    },
-    "bindings": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
-      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
-      "dev": true,
-      "requires": {
-        "file-uri-to-path": "1.0.0"
-      }
-    },
-    "bl": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
-      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
-      "requires": {
-        "buffer": "^5.5.0",
-        "inherits": "^2.0.4",
-        "readable-stream": "^3.4.0"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.6.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        }
-      }
-    },
-    "body-parser": {
-      "version": "1.20.1",
-      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
-      "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
-      "requires": {
-        "bytes": "3.1.2",
-        "content-type": "~1.0.4",
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "destroy": "1.2.0",
-        "http-errors": "2.0.0",
-        "iconv-lite": "0.4.24",
-        "on-finished": "2.4.1",
-        "qs": "6.11.0",
-        "raw-body": "2.5.1",
-        "type-is": "~1.6.18",
-        "unpipe": "1.0.0"
-      },
-      "dependencies": {
-        "bytes": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
-          "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
-        }
-      }
-    },
-    "boolbase": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
-      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
-    },
-    "brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "requires": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "dev": true,
-      "requires": {
-        "fill-range": "^7.0.1"
-      }
-    },
-    "brfs": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz",
-      "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==",
-      "optional": true,
-      "requires": {
-        "quote-stream": "^1.0.1",
-        "resolve": "^1.1.5",
-        "static-module": "^2.2.0",
-        "through2": "^2.0.0"
-      }
-    },
-    "browserslist": {
-      "version": "4.21.5",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
-      "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
-      "dev": true,
-      "requires": {
-        "caniuse-lite": "^1.0.30001449",
-        "electron-to-chromium": "^1.4.284",
-        "node-releases": "^2.0.8",
-        "update-browserslist-db": "^1.0.10"
-      }
-    },
-    "bser": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
-      "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
-      "dev": true,
-      "requires": {
-        "node-int64": "^0.4.0"
-      }
-    },
-    "buffer": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
-      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
-      "requires": {
-        "base64-js": "^1.3.1",
-        "ieee754": "^1.1.13"
-      }
-    },
-    "buffer-crc32": {
-      "version": "0.2.13",
-      "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
-      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="
-    },
-    "buffer-equal": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
-      "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
-      "optional": true
-    },
-    "buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
-      "devOptional": true
-    },
-    "bytes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
-      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
-    },
-    "cacheable-lookup": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
-      "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="
-    },
-    "cacheable-request": {
-      "version": "10.2.3",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.3.tgz",
-      "integrity": "sha512-6BehRBOs7iurNjAYN9iPazTwFDaMQavJO8W1MEm3s2pH8q/tkPTtLDRUZaweWK87WFGf2Y5wLAlaCJlR5kOz3w==",
-      "requires": {
-        "@types/http-cache-semantics": "^4.0.1",
-        "get-stream": "^6.0.1",
-        "http-cache-semantics": "^4.1.0",
-        "keyv": "^4.5.2",
-        "mimic-response": "^4.0.0",
-        "normalize-url": "^8.0.0",
-        "responselike": "^3.0.0"
-      },
-      "dependencies": {
-        "get-stream": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-          "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
-        }
-      }
-    },
-    "call-bind": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-      "requires": {
-        "function-bind": "^1.1.1",
-        "get-intrinsic": "^1.0.2"
-      }
-    },
-    "callsites": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
-      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
-    },
-    "camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true
-    },
-    "caniuse-lite": {
-      "version": "1.0.30001464",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz",
-      "integrity": "sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g==",
-      "dev": true
-    },
-    "canvas": {
-      "version": "2.9.0",
-      "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.0.tgz",
-      "integrity": "sha512-0l93g7uxp7rMyr7H+XRQ28A3ud0dKIUTIEkUe1Dxh4rjUYN7B93+SjC3r1PDKA18xcQN87OFGgUnyw7LSgNLSQ==",
-      "optional": true,
-      "requires": {
-        "@mapbox/node-pre-gyp": "^1.0.0",
-        "nan": "^2.15.0",
-        "simple-get": "^3.0.3"
-      }
-    },
-    "caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
-      "optional": true
-    },
-    "chalk": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-      "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
-      "requires": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      }
-    },
-    "char-regex": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
-      "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
-      "dev": true
-    },
-    "chardet": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.5.0.tgz",
-      "integrity": "sha512-Nj3VehbbFs/1ZnJJJaL3ztEf3Nu5Fs6YV/NBs6lyz/iDDHUU+X9QNk5QgPy1/5Rjtb/cGVf+NyazP7kVEJqKRg=="
-    },
-    "chartist": {
-      "version": "0.11.4",
-      "resolved": "https://registry.npmjs.org/chartist/-/chartist-0.11.4.tgz",
-      "integrity": "sha512-H4AimxaUD738/u9Mq8t27J4lh6STsLi4BQHt65nOtpLk3xyrBPaLiLMrHw7/WV9CmsjGA02WihjuL5qpSagLYw==",
-      "optional": true
-    },
-    "chartist-plugin-axistitle": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/chartist-plugin-axistitle/-/chartist-plugin-axistitle-0.0.1.tgz",
-      "integrity": "sha512-svUtzT1ZlrgmnKqJE81rxk403b9cS7KlEPLfclANpoA75+GRFXdZtlF/X94HMKo86I6gRAaE9laa2N6DKiCubA==",
-      "optional": true
-    },
-    "cheerio": {
-      "version": "1.0.0-rc.12",
-      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
-      "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
-      "requires": {
-        "cheerio-select": "^2.1.0",
-        "dom-serializer": "^2.0.0",
-        "domhandler": "^5.0.3",
-        "domutils": "^3.0.1",
-        "htmlparser2": "^8.0.1",
-        "parse5": "^7.0.0",
-        "parse5-htmlparser2-tree-adapter": "^7.0.0"
-      }
-    },
-    "cheerio-select": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
-      "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
-      "requires": {
-        "boolbase": "^1.0.0",
-        "css-select": "^5.1.0",
-        "css-what": "^6.1.0",
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.3",
-        "domutils": "^3.0.1"
-      }
-    },
-    "chess.js": {
-      "version": "1.0.0-beta.1",
-      "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.0.0-beta.1.tgz",
-      "integrity": "sha512-yXGLpKcorxm8TYzDf7Yu7sxkjuWDeFCFmR4/8GG4+5ksdFbYOyfp+MUtN3Z/EuZr5dOxFgjNyBoqbzQpIN5Z8w==",
-      "optional": true
-    },
-    "chownr": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-      "devOptional": true
-    },
-    "ci-info": {
-      "version": "3.8.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz",
-      "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==",
-      "dev": true
-    },
-    "cjs-module-lexer": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
-      "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
-      "dev": true
-    },
-    "clipboard": {
-      "version": "2.0.11",
-      "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz",
-      "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
-      "requires": {
-        "good-listener": "^1.2.2",
-        "select": "^1.1.2",
-        "tiny-emitter": "^2.0.0"
-      }
-    },
-    "cliui": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
-      "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
-      "dev": true,
-      "requires": {
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.1",
-        "wrap-ansi": "^7.0.0"
-      }
-    },
-    "clone": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
-      "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
-    },
-    "co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
-      "devOptional": true
-    },
-    "collect-v8-coverage": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
-      "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
-      "dev": true
-    },
-    "color": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
-      "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
-      "requires": {
-        "color-convert": "^2.0.1",
-        "color-string": "^1.9.0"
-      }
-    },
-    "color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "requires": {
-        "color-name": "~1.1.4"
-      }
-    },
-    "color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
-    },
-    "color-string": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
-      "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
-      "requires": {
-        "color-name": "^1.0.0",
-        "simple-swizzle": "^0.2.2"
-      }
-    },
-    "color-support": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
-      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
-      "devOptional": true
-    },
-    "combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "commander": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
-      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
-    },
-    "common-path-prefix": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
-      "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w=="
-    },
-    "compressible": {
-      "version": "2.0.18",
-      "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
-      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
-      "requires": {
-        "mime-db": ">= 1.43.0 < 2"
-      }
-    },
-    "compression": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
-      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
-      "requires": {
-        "accepts": "~1.3.5",
-        "bytes": "3.0.0",
-        "compressible": "~2.0.16",
-        "debug": "2.6.9",
-        "on-headers": "~1.0.2",
-        "safe-buffer": "5.1.2",
-        "vary": "~1.1.2"
-      }
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "optional": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "console-control-strings": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
-      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
-      "devOptional": true
-    },
-    "content-disposition": {
-      "version": "0.5.4",
-      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
-      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
-      "requires": {
-        "safe-buffer": "5.2.1"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        }
-      }
-    },
-    "content-type": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
-      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
-    },
-    "content-type-parser": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz",
-      "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==",
-      "optional": true
-    },
-    "convert-source-map": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
-      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
-      "devOptional": true,
-      "requires": {
-        "safe-buffer": "~5.1.1"
-      }
-    },
-    "cookie": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
-      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
-    },
-    "cookie-signature": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
-      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
-    },
-    "core-util-is": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
-      "optional": true
-    },
-    "cosmiconfig": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz",
-      "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==",
-      "requires": {
-        "import-fresh": "^3.2.1",
-        "js-yaml": "^4.1.0",
-        "parse-json": "^5.0.0",
-        "path-type": "^4.0.0"
-      }
-    },
-    "cross-fetch": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
-      "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
-      "requires": {
-        "node-fetch": "2.6.7"
-      },
-      "dependencies": {
-        "node-fetch": {
-          "version": "2.6.7",
-          "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-          "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
-          "requires": {
-            "whatwg-url": "^5.0.0"
-          }
-        },
-        "webidl-conversions": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-          "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
-        },
-        "whatwg-url": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-          "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
-          "requires": {
-            "tr46": "~0.0.3",
-            "webidl-conversions": "^3.0.0"
-          }
-        }
-      }
-    },
-    "cross-spawn": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.1.0",
-        "shebang-command": "^2.0.0",
-        "which": "^2.0.1"
-      }
-    },
-    "crypto-js": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz",
-      "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
-      "optional": true
-    },
-    "css-mediaquery": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz",
-      "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==",
-      "optional": true
-    },
-    "css-select": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
-      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
-      "requires": {
-        "boolbase": "^1.0.0",
-        "css-what": "^6.1.0",
-        "domhandler": "^5.0.2",
-        "domutils": "^3.0.1",
-        "nth-check": "^2.0.1"
-      }
-    },
-    "css-tree": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
-      "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
-      "requires": {
-        "mdn-data": "2.0.28",
-        "source-map-js": "^1.0.1"
-      }
-    },
-    "css-what": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
-      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw=="
-    },
-    "cssesc": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
-      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
-    },
-    "csso": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
-      "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
-      "requires": {
-        "css-tree": "~2.2.0"
-      }
-    },
-    "cssom": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
-      "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw=="
-    },
-    "cssstyle": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
-      "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
-      "requires": {
-        "cssom": "~0.3.6"
-      },
-      "dependencies": {
-        "cssom": {
-          "version": "0.3.8",
-          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-          "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg=="
-        }
-      }
-    },
-    "csstype": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
-      "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA=="
-    },
-    "d3": {
-      "version": "7.8.1",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.1.tgz",
-      "integrity": "sha512-fdipulGWUYTZTxxU9gDJ2P4mpZL2u7Oqe6n2FI95Q8UY0AjbKNYjPHvhLOsvR+HcSao4vo3YYy4Bk9CWOrt1Vw==",
-      "requires": {
-        "d3-array": "3",
-        "d3-axis": "3",
-        "d3-brush": "3",
-        "d3-chord": "3",
-        "d3-color": "3",
-        "d3-contour": "4",
-        "d3-delaunay": "6",
-        "d3-dispatch": "3",
-        "d3-drag": "3",
-        "d3-dsv": "3",
-        "d3-ease": "3",
-        "d3-fetch": "3",
-        "d3-force": "3",
-        "d3-format": "3",
-        "d3-geo": "3",
-        "d3-hierarchy": "3",
-        "d3-interpolate": "3",
-        "d3-path": "3",
-        "d3-polygon": "3",
-        "d3-quadtree": "3",
-        "d3-random": "3",
-        "d3-scale": "4",
-        "d3-scale-chromatic": "3",
-        "d3-selection": "3",
-        "d3-shape": "3",
-        "d3-time": "3",
-        "d3-time-format": "4",
-        "d3-timer": "3",
-        "d3-transition": "3",
-        "d3-zoom": "3"
-      }
-    },
-    "d3-array": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.0.tgz",
-      "integrity": "sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g==",
-      "requires": {
-        "internmap": "1 - 2"
-      }
-    },
-    "d3-axis": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz",
-      "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="
-    },
-    "d3-brush": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz",
-      "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==",
-      "requires": {
-        "d3-dispatch": "1 - 3",
-        "d3-drag": "2 - 3",
-        "d3-interpolate": "1 - 3",
-        "d3-selection": "3",
-        "d3-transition": "3"
-      }
-    },
-    "d3-chord": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz",
-      "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==",
-      "requires": {
-        "d3-path": "1 - 3"
-      }
-    },
-    "d3-color": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
-      "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="
-    },
-    "d3-contour": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.0.tgz",
-      "integrity": "sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw==",
-      "requires": {
-        "d3-array": "^3.2.0"
-      }
-    },
-    "d3-delaunay": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz",
-      "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==",
-      "requires": {
-        "delaunator": "5"
-      }
-    },
-    "d3-dispatch": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz",
-      "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="
-    },
-    "d3-drag": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz",
-      "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==",
-      "requires": {
-        "d3-dispatch": "1 - 3",
-        "d3-selection": "3"
-      }
-    },
-    "d3-dsv": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz",
-      "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==",
-      "requires": {
-        "commander": "7",
-        "iconv-lite": "0.6",
-        "rw": "1"
-      },
-      "dependencies": {
-        "iconv-lite": {
-          "version": "0.6.3",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3.0.0"
-          }
-        }
-      }
-    },
-    "d3-ease": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz",
-      "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="
-    },
-    "d3-fetch": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz",
-      "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==",
-      "requires": {
-        "d3-dsv": "1 - 3"
-      }
-    },
-    "d3-force": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz",
-      "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==",
-      "requires": {
-        "d3-dispatch": "1 - 3",
-        "d3-quadtree": "1 - 3",
-        "d3-timer": "1 - 3"
-      }
-    },
-    "d3-format": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
-      "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA=="
-    },
-    "d3-geo": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.0.1.tgz",
-      "integrity": "sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA==",
-      "requires": {
-        "d3-array": "2.5.0 - 3"
-      }
-    },
-    "d3-hierarchy": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz",
-      "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="
-    },
-    "d3-interpolate": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
-      "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
-      "requires": {
-        "d3-color": "1 - 3"
-      }
-    },
-    "d3-path": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.0.1.tgz",
-      "integrity": "sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w=="
-    },
-    "d3-polygon": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz",
-      "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="
-    },
-    "d3-quadtree": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz",
-      "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="
-    },
-    "d3-random": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz",
-      "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="
-    },
-    "d3-scale": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz",
-      "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==",
-      "requires": {
-        "d3-array": "2.10.0 - 3",
-        "d3-format": "1 - 3",
-        "d3-interpolate": "1.2.0 - 3",
-        "d3-time": "2.1.1 - 3",
-        "d3-time-format": "2 - 4"
-      }
-    },
-    "d3-scale-chromatic": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz",
-      "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==",
-      "requires": {
-        "d3-color": "1 - 3",
-        "d3-interpolate": "1 - 3"
-      }
-    },
-    "d3-selection": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz",
-      "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="
-    },
-    "d3-shape": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.1.0.tgz",
-      "integrity": "sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ==",
-      "requires": {
-        "d3-path": "1 - 3"
-      }
-    },
-    "d3-time": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.0.0.tgz",
-      "integrity": "sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ==",
-      "requires": {
-        "d3-array": "2 - 3"
-      }
-    },
-    "d3-time-format": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz",
-      "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==",
-      "requires": {
-        "d3-time": "1 - 3"
-      }
-    },
-    "d3-timer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz",
-      "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="
-    },
-    "d3-transition": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz",
-      "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==",
-      "requires": {
-        "d3-color": "1 - 3",
-        "d3-dispatch": "1 - 3",
-        "d3-ease": "1 - 3",
-        "d3-interpolate": "1 - 3",
-        "d3-timer": "1 - 3"
-      }
-    },
-    "d3-zoom": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz",
-      "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==",
-      "requires": {
-        "d3-dispatch": "1 - 3",
-        "d3-drag": "2 - 3",
-        "d3-interpolate": "1 - 3",
-        "d3-selection": "2 - 3",
-        "d3-transition": "2 - 3"
-      }
-    },
-    "dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
-      "optional": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "data-uri-to-buffer": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
-      "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA=="
-    },
-    "debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "decimal.js": {
-      "version": "10.4.3",
-      "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
-      "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
-    },
-    "decode-uri-component": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
-      "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
-      "optional": true
-    },
-    "decompress-response": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
-      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
-      "requires": {
-        "mimic-response": "^3.1.0"
-      },
-      "dependencies": {
-        "mimic-response": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
-          "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
-        }
-      }
-    },
-    "dedent": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
-      "dev": true
-    },
-    "deep-extend": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
-    },
-    "deep-is": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
-    },
-    "deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
-    },
-    "defer-to-connect": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
-      "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="
-    },
-    "delaunator": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz",
-      "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==",
-      "requires": {
-        "robust-predicates": "^3.0.0"
-      }
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
-    },
-    "delegate": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
-      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
-    },
-    "delegates": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
-      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
-      "devOptional": true
-    },
-    "depd": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
-      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
-    },
-    "deprecation": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
-      "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
-    },
-    "destroy": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
-      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
-    },
-    "detect-libc": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
-      "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w=="
-    },
-    "detect-newline": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
-      "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
-      "dev": true
-    },
-    "devtools-protocol": {
-      "version": "0.0.1068969",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1068969.tgz",
-      "integrity": "sha512-ATFTrPbY1dKYhPPvpjtwWKSK2mIwGmRwX54UASn9THEuIZCe2n9k3vVuMmt6jWeL+e5QaaguEv/pMyR+JQB7VQ=="
-    },
-    "diff-sequences": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
-      "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
-      "dev": true
-    },
-    "doctrine": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
-      "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
-      "dev": true,
-      "requires": {
-        "esutils": "^2.0.2"
-      }
-    },
-    "dom-serializer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
-      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
-      "requires": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
-        "entities": "^4.2.0"
-      },
-      "dependencies": {
-        "entities": {
-          "version": "4.4.0",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
-        }
-      }
-    },
-    "domelementtype": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
-      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
-    },
-    "domhandler": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
-      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
-      "requires": {
-        "domelementtype": "^2.3.0"
-      }
-    },
-    "domutils": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
-      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
-      "requires": {
-        "dom-serializer": "^2.0.0",
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.1"
-      }
-    },
-    "duplexer2": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
-      "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
-      "optional": true,
-      "requires": {
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "ecc-jsbn": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
-      "optional": true,
-      "requires": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
-      }
-    },
-    "ee-first": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
-      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
-    },
-    "ejs": {
-      "version": "3.1.8",
-      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
-      "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
-      "requires": {
-        "jake": "^10.8.5"
-      }
-    },
-    "electron-to-chromium": {
-      "version": "1.4.328",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.328.tgz",
-      "integrity": "sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==",
-      "dev": true
-    },
-    "emittery": {
-      "version": "0.13.1",
-      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
-      "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
-      "dev": true
-    },
-    "emoji-name-map": {
-      "version": "1.2.9",
-      "resolved": "https://registry.npmjs.org/emoji-name-map/-/emoji-name-map-1.2.9.tgz",
-      "integrity": "sha512-MSM8y6koSqh/2uEMI2VoKA+Ac0qL5RkgFGP/pzL6n5FOrOJ7FOZFxgs7+uNpqA+AT+WmdbMPXkd3HnFXXdz4AA==",
-      "requires": {
-        "emojilib": "^2.0.2",
-        "iterate-object": "^1.3.1",
-        "map-o": "^2.0.1"
-      }
-    },
-    "emoji-regex": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "devOptional": true
-    },
-    "emojilib": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz",
-      "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw=="
-    },
-    "encodeurl": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
-      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
-    },
-    "end-of-stream": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
-      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
-      "requires": {
-        "once": "^1.4.0"
-      }
-    },
-    "entities": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
-      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
-    },
-    "error-ex": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
-      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
-      "requires": {
-        "is-arrayish": "^0.2.1"
-      }
-    },
-    "escalade": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
-      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-      "dev": true
-    },
-    "escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
-    },
-    "escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
-    },
-    "escodegen": {
-      "version": "1.14.3",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
-      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
-      "optional": true,
-      "requires": {
-        "esprima": "^4.0.1",
-        "estraverse": "^4.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1",
-        "source-map": "~0.6.1"
-      },
-      "dependencies": {
-        "estraverse": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-          "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-          "optional": true
-        },
-        "levn": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-          "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-          "optional": true,
-          "requires": {
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2"
-          }
-        },
-        "optionator": {
-          "version": "0.8.3",
-          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-          "optional": true,
-          "requires": {
-            "deep-is": "~0.1.3",
-            "fast-levenshtein": "~2.0.6",
-            "levn": "~0.3.0",
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2",
-            "word-wrap": "~1.2.3"
-          }
-        },
-        "prelude-ls": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-          "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
-          "optional": true
-        },
-        "type-check": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-          "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-          "optional": true,
-          "requires": {
-            "prelude-ls": "~1.1.2"
-          }
-        }
-      }
-    },
-    "eslint": {
-      "version": "8.35.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz",
-      "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==",
-      "dev": true,
-      "requires": {
-        "@eslint/eslintrc": "^2.0.0",
-        "@eslint/js": "8.35.0",
-        "@humanwhocodes/config-array": "^0.11.8",
-        "@humanwhocodes/module-importer": "^1.0.1",
-        "@nodelib/fs.walk": "^1.2.8",
-        "ajv": "^6.10.0",
-        "chalk": "^4.0.0",
-        "cross-spawn": "^7.0.2",
-        "debug": "^4.3.2",
-        "doctrine": "^3.0.0",
-        "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.1.1",
-        "eslint-utils": "^3.0.0",
-        "eslint-visitor-keys": "^3.3.0",
-        "espree": "^9.4.0",
-        "esquery": "^1.4.2",
-        "esutils": "^2.0.2",
-        "fast-deep-equal": "^3.1.3",
-        "file-entry-cache": "^6.0.1",
-        "find-up": "^5.0.0",
-        "glob-parent": "^6.0.2",
-        "globals": "^13.19.0",
-        "grapheme-splitter": "^1.0.4",
-        "ignore": "^5.2.0",
-        "import-fresh": "^3.0.0",
-        "imurmurhash": "^0.1.4",
-        "is-glob": "^4.0.0",
-        "is-path-inside": "^3.0.3",
-        "js-sdsl": "^4.1.4",
-        "js-yaml": "^4.1.0",
-        "json-stable-stringify-without-jsonify": "^1.0.1",
-        "levn": "^0.4.1",
-        "lodash.merge": "^4.6.2",
-        "minimatch": "^3.1.2",
-        "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
-        "regexpp": "^3.2.0",
-        "strip-ansi": "^6.0.1",
-        "strip-json-comments": "^3.1.0",
-        "text-table": "^0.2.0"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "1.1.11",
-          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "debug": {
-          "version": "4.3.2",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-          "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "find-up": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-          "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^6.0.0",
-            "path-exists": "^4.0.0"
-          }
-        },
-        "glob-parent": {
-          "version": "6.0.2",
-          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
-          "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
-          "dev": true,
-          "requires": {
-            "is-glob": "^4.0.3"
-          }
-        },
-        "locate-path": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-          "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^5.0.0"
-          }
-        },
-        "minimatch": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-          "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        },
-        "p-locate": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-          "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^3.0.2"
-          }
-        }
-      }
-    },
-    "eslint-scope": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
-      "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
-      "dev": true,
-      "requires": {
-        "esrecurse": "^4.3.0",
-        "estraverse": "^5.2.0"
-      }
-    },
-    "eslint-utils": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
-      "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
-      "dev": true,
-      "requires": {
-        "eslint-visitor-keys": "^2.0.0"
-      },
-      "dependencies": {
-        "eslint-visitor-keys": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
-          "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
-          "dev": true
-        }
-      }
-    },
-    "eslint-visitor-keys": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
-      "dev": true
-    },
-    "espree": {
-      "version": "9.4.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz",
-      "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==",
-      "dev": true,
-      "requires": {
-        "acorn": "^8.8.0",
-        "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.3.0"
-      }
-    },
-    "esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
-    },
-    "esquery": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
-      "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^5.1.0"
-      }
-    },
-    "esrecurse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
-      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
-      "dev": true,
-      "requires": {
-        "estraverse": "^5.2.0"
-      }
-    },
-    "estraverse": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
-      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
-    },
-    "esutils": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
-      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
-    },
-    "etag": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
-      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
-    },
-    "execa": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
-      "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
-      "dev": true,
-      "requires": {
-        "cross-spawn": "^7.0.3",
-        "get-stream": "^6.0.0",
-        "human-signals": "^2.1.0",
-        "is-stream": "^2.0.0",
-        "merge-stream": "^2.0.0",
-        "npm-run-path": "^4.0.1",
-        "onetime": "^5.1.2",
-        "signal-exit": "^3.0.3",
-        "strip-final-newline": "^2.0.0"
-      },
-      "dependencies": {
-        "get-stream": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-          "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
-          "dev": true
-        }
-      }
-    },
-    "exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
-      "dev": true
-    },
-    "expand-template": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
-      "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="
-    },
-    "expect": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz",
-      "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==",
-      "dev": true,
-      "requires": {
-        "@jest/expect-utils": "^29.5.0",
-        "jest-get-type": "^29.4.3",
-        "jest-matcher-utils": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-util": "^29.5.0"
-      }
-    },
-    "express": {
-      "version": "4.18.2",
-      "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
-      "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
-      "requires": {
-        "accepts": "~1.3.8",
-        "array-flatten": "1.1.1",
-        "body-parser": "1.20.1",
-        "content-disposition": "0.5.4",
-        "content-type": "~1.0.4",
-        "cookie": "0.5.0",
-        "cookie-signature": "1.0.6",
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "finalhandler": "1.2.0",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "merge-descriptors": "1.0.1",
-        "methods": "~1.1.2",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "path-to-regexp": "0.1.7",
-        "proxy-addr": "~2.0.7",
-        "qs": "6.11.0",
-        "range-parser": "~1.2.1",
-        "safe-buffer": "5.2.1",
-        "send": "0.18.0",
-        "serve-static": "1.15.0",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "type-is": "~1.6.18",
-        "utils-merge": "1.0.1",
-        "vary": "~1.1.2"
-      },
-      "dependencies": {
-        "safe-buffer": {
-          "version": "5.2.1",
-          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
-        }
-      }
-    },
-    "express-rate-limit": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz",
-      "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==",
-      "requires": {}
-    },
-    "extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "optional": true
-    },
-    "extract-zip": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
-      "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
-      "requires": {
-        "@types/yauzl": "^2.9.1",
-        "debug": "^4.1.1",
-        "get-stream": "^5.1.0",
-        "yauzl": "^2.10.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        }
-      }
-    },
-    "extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
-      "optional": true
-    },
-    "falafel": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz",
-      "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==",
-      "optional": true,
-      "requires": {
-        "acorn": "^7.1.1",
-        "isarray": "^2.0.1"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "7.4.1",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-          "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-          "optional": true
-        }
-      }
-    },
-    "fast-deep-equal": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
-      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "devOptional": true
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
-      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "devOptional": true
-    },
-    "fast-levenshtein": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
-    },
-    "fastq": {
-      "version": "1.13.0",
-      "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
-      "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
-      "dev": true,
-      "requires": {
-        "reusify": "^1.0.4"
-      }
-    },
-    "fb-watchman": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
-      "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
-      "dev": true,
-      "requires": {
-        "bser": "2.1.1"
-      }
-    },
-    "fd-slicer": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-      "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
-      "requires": {
-        "pend": "~1.2.0"
-      }
-    },
-    "fetch-blob": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.1.4.tgz",
-      "integrity": "sha512-Eq5Xv5+VlSrYWEqKrusxY1C3Hm/hjeAsCGVG3ft7pZahlUAChpGZT/Ms1WmSLnEAisEXszjzu/s+ce6HZB2VHA==",
-      "requires": {
-        "node-domexception": "^1.0.0",
-        "web-streams-polyfill": "^3.0.3"
-      }
-    },
-    "file-entry-cache": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
-      "dev": true,
-      "requires": {
-        "flat-cache": "^3.0.4"
-      }
-    },
-    "file-type": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.0.tgz",
-      "integrity": "sha512-M3RQMWY3F2ykyWZ+IHwNCjpnUmukYhtdkGGC1ZVEUb0ve5REGF7NNJ4Q9ehCUabtQKtSVFOMbFTXgJlFb0DQIg==",
-      "requires": {
-        "readable-web-to-node-stream": "^3.0.2",
-        "strtok3": "^7.0.0",
-        "token-types": "^5.0.1"
-      }
-    },
-    "file-uri-to-path": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
-      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
-      "dev": true
-    },
-    "filelist": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz",
-      "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==",
-      "requires": {
-        "minimatch": "^5.0.1"
-      },
-      "dependencies": {
-        "minimatch": {
-          "version": "5.1.4",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
-          "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
-          "requires": {
-            "brace-expansion": "^2.0.1"
-          }
-        }
-      }
-    },
-    "fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "dev": true,
-      "requires": {
-        "to-regex-range": "^5.0.1"
-      }
-    },
-    "filter-obj": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz",
-      "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==",
-      "optional": true
-    },
-    "finalhandler": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
-      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
-      "requires": {
-        "debug": "2.6.9",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "on-finished": "2.4.1",
-        "parseurl": "~1.3.3",
-        "statuses": "2.0.1",
-        "unpipe": "~1.0.0"
-      }
-    },
-    "find-up": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
-      "dev": true,
-      "requires": {
-        "locate-path": "^5.0.0",
-        "path-exists": "^4.0.0"
-      }
-    },
-    "flat-cache": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
-      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
-      "dev": true,
-      "requires": {
-        "flatted": "^3.1.0",
-        "rimraf": "^3.0.2"
-      }
-    },
-    "flatted": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
-      "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
-      "dev": true
-    },
-    "follow-redirects": {
-      "version": "1.15.2",
-      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
-      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
-    },
-    "forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
-      "optional": true
-    },
-    "form-data": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
-      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "mime-types": "^2.1.12"
-      }
-    },
-    "form-data-encoder": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
-      "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="
-    },
-    "formdata-polyfill": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
-      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
-      "requires": {
-        "fetch-blob": "^3.1.2"
-      }
-    },
-    "forwarded": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
-      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
-    },
-    "fresh": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
-      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
-    },
-    "fs-constants": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
-      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
-    },
-    "fs-minipass": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-      "devOptional": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-    },
-    "fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "dev": true,
-      "optional": true
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-    },
-    "gauge": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
-      "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
-      "devOptional": true,
-      "requires": {
-        "aproba": "^1.0.3 || ^2.0.0",
-        "color-support": "^1.1.2",
-        "console-control-strings": "^1.0.0",
-        "has-unicode": "^2.0.1",
-        "object-assign": "^4.1.1",
-        "signal-exit": "^3.0.0",
-        "string-width": "^4.2.3",
-        "strip-ansi": "^6.0.1",
-        "wide-align": "^1.1.2"
-      }
-    },
-    "gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true
-    },
-    "get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true
-    },
-    "get-intrinsic": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
-      "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
-      "requires": {
-        "function-bind": "^1.1.1",
-        "has": "^1.0.3",
-        "has-symbols": "^1.0.3"
-      }
-    },
-    "get-package-type": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
-      "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
-      "dev": true
-    },
-    "get-stream": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
-      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
-      "requires": {
-        "pump": "^3.0.0"
-      }
-    },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
-      "optional": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "gifencoder": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz",
-      "integrity": "sha512-x19DcyWY10SkshBpokqFOo/HBht9GB75evRYvaLMbez9p+yB/o+kt0fK9AwW59nFiAMs2UUQsjv1lX/hvu9Ong==",
-      "optional": true,
-      "requires": {
-        "canvas": "^2.2.0"
-      }
-    },
-    "github-from-package": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
-      "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="
-    },
-    "glob": {
-      "version": "7.1.7",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
-      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "1.1.11",
-          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "minimatch": {
-          "version": "3.1.1",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.1.tgz",
-          "integrity": "sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==",
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        }
-      }
-    },
-    "globals": {
-      "version": "13.20.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
-      "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
-      "dev": true,
-      "requires": {
-        "type-fest": "^0.20.2"
-      }
-    },
-    "good-listener": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
-      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
-      "requires": {
-        "delegate": "^3.1.2"
-      }
-    },
-    "got": {
-      "version": "12.5.3",
-      "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz",
-      "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==",
-      "requires": {
-        "@sindresorhus/is": "^5.2.0",
-        "@szmarczak/http-timer": "^5.0.1",
-        "cacheable-lookup": "^7.0.0",
-        "cacheable-request": "^10.2.1",
-        "decompress-response": "^6.0.0",
-        "form-data-encoder": "^2.1.2",
-        "get-stream": "^6.0.1",
-        "http2-wrapper": "^2.1.10",
-        "lowercase-keys": "^3.0.0",
-        "p-cancelable": "^3.0.0",
-        "responselike": "^3.0.0"
-      },
-      "dependencies": {
-        "get-stream": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
-          "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
-        }
-      }
-    },
-    "graceful-fs": {
-      "version": "4.2.10",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
-      "dev": true
-    },
-    "grapheme-splitter": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
-      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
-      "dev": true
-    },
-    "har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
-      "optional": true
-    },
-    "har-validator": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
-      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
-      "optional": true,
-      "requires": {
-        "ajv": "^6.12.3",
-        "har-schema": "^2.0.0"
-      }
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
-    },
-    "has-symbols": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
-      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
-    },
-    "has-unicode": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
-      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
-      "devOptional": true
-    },
-    "html-encoding-sniffer": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
-      "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
-      "requires": {
-        "whatwg-encoding": "^2.0.0"
-      },
-      "dependencies": {
-        "iconv-lite": {
-          "version": "0.6.3",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3.0.0"
-          }
-        },
-        "whatwg-encoding": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
-          "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
-          "requires": {
-            "iconv-lite": "0.6.3"
-          }
-        }
-      }
-    },
-    "html-escaper": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
-      "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
-      "dev": true
-    },
-    "htmlparser2": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
-      "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
-      "requires": {
-        "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
-        "domutils": "^3.0.1",
-        "entities": "^4.3.0"
-      },
-      "dependencies": {
-        "entities": {
-          "version": "4.4.0",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
-        }
-      }
-    },
-    "http-cache-semantics": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
-      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
-    },
-    "http-errors": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
-      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
-      "requires": {
-        "depd": "2.0.0",
-        "inherits": "2.0.4",
-        "setprototypeof": "1.2.0",
-        "statuses": "2.0.1",
-        "toidentifier": "1.0.1"
-      }
-    },
-    "http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
-      "optional": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      }
-    },
-    "http2-wrapper": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
-      "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==",
-      "requires": {
-        "quick-lru": "^5.1.1",
-        "resolve-alpn": "^1.2.0"
-      }
-    },
-    "https-proxy-agent": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
-      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
-      "requires": {
-        "agent-base": "6",
-        "debug": "4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.1",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        }
-      }
-    },
-    "human-signals": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
-      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
-      "dev": true
-    },
-    "humanize-ms": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
-      "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==",
-      "optional": true,
-      "requires": {
-        "ms": "^2.0.0"
-      }
-    },
-    "iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      }
-    },
-    "ieee754": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
-    },
-    "ignore": {
-      "version": "5.2.4",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
-      "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ=="
-    },
-    "import-fresh": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
-      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
-      "requires": {
-        "parent-module": "^1.0.0",
-        "resolve-from": "^4.0.0"
-      }
-    },
-    "import-local": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
-      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
-      "dev": true,
-      "requires": {
-        "pkg-dir": "^4.2.0",
-        "resolve-cwd": "^3.0.0"
-      }
-    },
-    "imurmurhash": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
-    },
-    "ini": {
-      "version": "1.3.8",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
-      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
-    },
-    "internmap": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz",
-      "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="
-    },
-    "ipaddr.js": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
-      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
-    },
-    "is_js": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz",
-      "integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg==",
-      "optional": true
-    },
-    "is-arrayish": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
-      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
-    },
-    "is-core-module": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
-      "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
-      "devOptional": true,
-      "requires": {
-        "has": "^1.0.3"
-      }
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
-    },
-    "is-fullwidth-code-point": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "devOptional": true
-    },
-    "is-generator-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
-      "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
-      "dev": true
-    },
-    "is-glob": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
-      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true
-    },
-    "is-path-inside": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
-      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
-      "dev": true
-    },
-    "is-plain-object": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
-      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
-    },
-    "is-potential-custom-element-name": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
-      "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="
-    },
-    "is-stream": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
-      "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
-      "dev": true
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
-      "optional": true
-    },
-    "isarray": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
-      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
-      "optional": true
-    },
-    "isbinaryfile": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz",
-      "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w=="
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
-      "optional": true
-    },
-    "istanbul-lib-coverage": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
-      "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
-      "dev": true
-    },
-    "istanbul-lib-instrument": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
-      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.12.3",
-        "@babel/parser": "^7.14.7",
-        "@istanbuljs/schema": "^0.1.2",
-        "istanbul-lib-coverage": "^3.2.0",
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
-      }
-    },
-    "istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
-      "dev": true,
-      "requires": {
-        "istanbul-lib-coverage": "^3.0.0",
-        "make-dir": "^3.0.0",
-        "supports-color": "^7.1.0"
-      }
-    },
-    "istanbul-lib-source-maps": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
-      "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.1",
-        "istanbul-lib-coverage": "^3.0.0",
-        "source-map": "^0.6.1"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "dev": true,
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-          "dev": true
-        }
-      }
-    },
-    "istanbul-reports": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
-      "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
-      "dev": true,
-      "requires": {
-        "html-escaper": "^2.0.0",
-        "istanbul-lib-report": "^3.0.0"
-      }
-    },
-    "iterate-object": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz",
-      "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw=="
-    },
-    "jake": {
-      "version": "10.8.5",
-      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
-      "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
-      "requires": {
-        "async": "^3.2.3",
-        "chalk": "^4.0.2",
-        "filelist": "^1.0.1",
-        "minimatch": "^3.0.4"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "1.1.11",
-          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "minimatch": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-          "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        }
-      }
-    },
-    "jest": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
-      "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==",
-      "dev": true,
-      "requires": {
-        "@jest/core": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "import-local": "^3.0.2",
-        "jest-cli": "^29.5.0"
-      }
-    },
-    "jest-changed-files": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz",
-      "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==",
-      "dev": true,
-      "requires": {
-        "execa": "^5.0.0",
-        "p-limit": "^3.1.0"
-      }
-    },
-    "jest-circus": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz",
-      "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^29.5.0",
-        "@jest/expect": "^29.5.0",
-        "@jest/test-result": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "co": "^4.6.0",
-        "dedent": "^0.7.0",
-        "is-generator-fn": "^2.0.0",
-        "jest-each": "^29.5.0",
-        "jest-matcher-utils": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-runtime": "^29.5.0",
-        "jest-snapshot": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "p-limit": "^3.1.0",
-        "pretty-format": "^29.5.0",
-        "pure-rand": "^6.0.0",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.3"
-      }
-    },
-    "jest-cli": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz",
-      "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==",
-      "dev": true,
-      "requires": {
-        "@jest/core": "^29.5.0",
-        "@jest/test-result": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "chalk": "^4.0.0",
-        "exit": "^0.1.2",
-        "graceful-fs": "^4.2.9",
-        "import-local": "^3.0.2",
-        "jest-config": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "jest-validate": "^29.5.0",
-        "prompts": "^2.0.1",
-        "yargs": "^17.3.1"
-      }
-    },
-    "jest-config": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz",
-      "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.11.6",
-        "@jest/test-sequencer": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "babel-jest": "^29.5.0",
-        "chalk": "^4.0.0",
-        "ci-info": "^3.2.0",
-        "deepmerge": "^4.2.2",
-        "glob": "^7.1.3",
-        "graceful-fs": "^4.2.9",
-        "jest-circus": "^29.5.0",
-        "jest-environment-node": "^29.5.0",
-        "jest-get-type": "^29.4.3",
-        "jest-regex-util": "^29.4.3",
-        "jest-resolve": "^29.5.0",
-        "jest-runner": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "jest-validate": "^29.5.0",
-        "micromatch": "^4.0.4",
-        "parse-json": "^5.2.0",
-        "pretty-format": "^29.5.0",
-        "slash": "^3.0.0",
-        "strip-json-comments": "^3.1.1"
-      }
-    },
-    "jest-diff": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
-      "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0",
-        "diff-sequences": "^29.4.3",
-        "jest-get-type": "^29.4.3",
-        "pretty-format": "^29.5.0"
-      }
-    },
-    "jest-docblock": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz",
-      "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==",
-      "dev": true,
-      "requires": {
-        "detect-newline": "^3.0.0"
-      }
-    },
-    "jest-each": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz",
-      "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^29.5.0",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^29.4.3",
-        "jest-util": "^29.5.0",
-        "pretty-format": "^29.5.0"
-      }
-    },
-    "jest-environment-node": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz",
-      "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^29.5.0",
-        "@jest/fake-timers": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@types/node": "*",
-        "jest-mock": "^29.5.0",
-        "jest-util": "^29.5.0"
-      }
-    },
-    "jest-get-type": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
-      "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
-      "dev": true
-    },
-    "jest-haste-map": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz",
-      "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^29.5.0",
-        "@types/graceful-fs": "^4.1.3",
-        "@types/node": "*",
-        "anymatch": "^3.0.3",
-        "fb-watchman": "^2.0.0",
-        "fsevents": "^2.3.2",
-        "graceful-fs": "^4.2.9",
-        "jest-regex-util": "^29.4.3",
-        "jest-util": "^29.5.0",
-        "jest-worker": "^29.5.0",
-        "micromatch": "^4.0.4",
-        "walker": "^1.0.8"
-      }
-    },
-    "jest-leak-detector": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz",
-      "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==",
-      "dev": true,
-      "requires": {
-        "jest-get-type": "^29.4.3",
-        "pretty-format": "^29.5.0"
-      }
-    },
-    "jest-matcher-utils": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz",
-      "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0",
-        "jest-diff": "^29.5.0",
-        "jest-get-type": "^29.4.3",
-        "pretty-format": "^29.5.0"
-      }
-    },
-    "jest-message-util": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz",
-      "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.12.13",
-        "@jest/types": "^29.5.0",
-        "@types/stack-utils": "^2.0.0",
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.9",
-        "micromatch": "^4.0.4",
-        "pretty-format": "^29.5.0",
-        "slash": "^3.0.0",
-        "stack-utils": "^2.0.3"
-      }
-    },
-    "jest-mock": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz",
-      "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^29.5.0",
-        "@types/node": "*",
-        "jest-util": "^29.5.0"
-      }
-    },
-    "jest-pnp-resolver": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
-      "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
-      "dev": true,
-      "requires": {}
-    },
-    "jest-regex-util": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz",
-      "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==",
-      "dev": true
-    },
-    "jest-resolve": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz",
-      "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0",
-        "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.5.0",
-        "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^29.5.0",
-        "jest-validate": "^29.5.0",
-        "resolve": "^1.20.0",
-        "resolve.exports": "^2.0.0",
-        "slash": "^3.0.0"
-      }
-    },
-    "jest-resolve-dependencies": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz",
-      "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==",
-      "dev": true,
-      "requires": {
-        "jest-regex-util": "^29.4.3",
-        "jest-snapshot": "^29.5.0"
-      }
-    },
-    "jest-runner": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz",
-      "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==",
-      "dev": true,
-      "requires": {
-        "@jest/console": "^29.5.0",
-        "@jest/environment": "^29.5.0",
-        "@jest/test-result": "^29.5.0",
-        "@jest/transform": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "emittery": "^0.13.1",
-        "graceful-fs": "^4.2.9",
-        "jest-docblock": "^29.4.3",
-        "jest-environment-node": "^29.5.0",
-        "jest-haste-map": "^29.5.0",
-        "jest-leak-detector": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-resolve": "^29.5.0",
-        "jest-runtime": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "jest-watcher": "^29.5.0",
-        "jest-worker": "^29.5.0",
-        "p-limit": "^3.1.0",
-        "source-map-support": "0.5.13"
-      }
-    },
-    "jest-runtime": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz",
-      "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==",
-      "dev": true,
-      "requires": {
-        "@jest/environment": "^29.5.0",
-        "@jest/fake-timers": "^29.5.0",
-        "@jest/globals": "^29.5.0",
-        "@jest/source-map": "^29.4.3",
-        "@jest/test-result": "^29.5.0",
-        "@jest/transform": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "cjs-module-lexer": "^1.0.0",
-        "collect-v8-coverage": "^1.0.0",
-        "glob": "^7.1.3",
-        "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-mock": "^29.5.0",
-        "jest-regex-util": "^29.4.3",
-        "jest-resolve": "^29.5.0",
-        "jest-snapshot": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "slash": "^3.0.0",
-        "strip-bom": "^4.0.0"
-      }
-    },
-    "jest-snapshot": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz",
-      "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==",
-      "dev": true,
-      "requires": {
-        "@babel/core": "^7.11.6",
-        "@babel/generator": "^7.7.2",
-        "@babel/plugin-syntax-jsx": "^7.7.2",
-        "@babel/plugin-syntax-typescript": "^7.7.2",
-        "@babel/traverse": "^7.7.2",
-        "@babel/types": "^7.3.3",
-        "@jest/expect-utils": "^29.5.0",
-        "@jest/transform": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@types/babel__traverse": "^7.0.6",
-        "@types/prettier": "^2.1.5",
-        "babel-preset-current-node-syntax": "^1.0.0",
-        "chalk": "^4.0.0",
-        "expect": "^29.5.0",
-        "graceful-fs": "^4.2.9",
-        "jest-diff": "^29.5.0",
-        "jest-get-type": "^29.4.3",
-        "jest-matcher-utils": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "natural-compare": "^1.4.0",
-        "pretty-format": "^29.5.0",
-        "semver": "^7.3.5"
-      }
-    },
-    "jest-util": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
-      "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^29.5.0",
-        "@types/node": "*",
-        "chalk": "^4.0.0",
-        "ci-info": "^3.2.0",
-        "graceful-fs": "^4.2.9",
-        "picomatch": "^2.2.3"
-      }
-    },
-    "jest-validate": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz",
-      "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==",
-      "dev": true,
-      "requires": {
-        "@jest/types": "^29.5.0",
-        "camelcase": "^6.2.0",
-        "chalk": "^4.0.0",
-        "jest-get-type": "^29.4.3",
-        "leven": "^3.1.0",
-        "pretty-format": "^29.5.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
-          "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
-          "dev": true
-        }
-      }
-    },
-    "jest-watcher": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz",
-      "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==",
-      "dev": true,
-      "requires": {
-        "@jest/test-result": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@types/node": "*",
-        "ansi-escapes": "^4.2.1",
-        "chalk": "^4.0.0",
-        "emittery": "^0.13.1",
-        "jest-util": "^29.5.0",
-        "string-length": "^4.0.1"
-      }
-    },
-    "jest-worker": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz",
-      "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*",
-        "jest-util": "^29.5.0",
-        "merge-stream": "^2.0.0",
-        "supports-color": "^8.0.0"
-      },
-      "dependencies": {
-        "supports-color": {
-          "version": "8.1.1",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
-          "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
-        }
-      }
-    },
-    "js-sdsl": {
-      "version": "4.1.4",
-      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
-      "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==",
-      "dev": true
-    },
-    "js-tokens": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
-      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
-    },
-    "js-yaml": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
-      "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
-      "requires": {
-        "argparse": "^2.0.1"
-      }
-    },
-    "jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
-      "optional": true
-    },
-    "jsdom": {
-      "version": "21.0.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.0.0.tgz",
-      "integrity": "sha512-AIw+3ZakSUtDYvhwPwWHiZsUi3zHugpMEKlNPaurviseYoBqo0zBd3zqoUi3LPCNtPFlEP8FiW9MqCZdjb2IYA==",
-      "requires": {
-        "abab": "^2.0.6",
-        "acorn": "^8.8.1",
-        "acorn-globals": "^7.0.0",
-        "cssom": "^0.5.0",
-        "cssstyle": "^2.3.0",
-        "data-urls": "^3.0.2",
-        "decimal.js": "^10.4.2",
-        "domexception": "^4.0.0",
-        "escodegen": "^2.0.0",
-        "form-data": "^4.0.0",
-        "html-encoding-sniffer": "^3.0.0",
-        "http-proxy-agent": "^5.0.0",
-        "https-proxy-agent": "^5.0.1",
-        "is-potential-custom-element-name": "^1.0.1",
-        "nwsapi": "^2.2.2",
-        "parse5": "^7.1.1",
-        "saxes": "^6.0.0",
-        "symbol-tree": "^3.2.4",
-        "tough-cookie": "^4.1.2",
-        "w3c-xmlserializer": "^4.0.0",
-        "webidl-conversions": "^7.0.0",
-        "whatwg-encoding": "^2.0.0",
-        "whatwg-mimetype": "^3.0.0",
-        "whatwg-url": "^11.0.0",
-        "ws": "^8.11.0",
-        "xml-name-validator": "^4.0.0"
-      },
-      "dependencies": {
-        "@tootallnate/once": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
-          "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A=="
-        },
-        "data-urls": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
-          "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
-          "requires": {
-            "abab": "^2.0.6",
-            "whatwg-mimetype": "^3.0.0",
-            "whatwg-url": "^11.0.0"
-          }
-        },
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "domexception": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
-          "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
-          "requires": {
-            "webidl-conversions": "^7.0.0"
-          }
-        },
-        "escodegen": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
-          "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
-          "requires": {
-            "esprima": "^4.0.1",
-            "estraverse": "^5.2.0",
-            "esutils": "^2.0.2",
-            "optionator": "^0.8.1",
-            "source-map": "~0.6.1"
-          }
-        },
-        "http-proxy-agent": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
-          "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
-          "requires": {
-            "@tootallnate/once": "2",
-            "agent-base": "6",
-            "debug": "4"
-          }
-        },
-        "iconv-lite": {
-          "version": "0.6.3",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3.0.0"
-          }
-        },
-        "levn": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-          "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-          "requires": {
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        },
-        "optionator": {
-          "version": "0.8.3",
-          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-          "requires": {
-            "deep-is": "~0.1.3",
-            "fast-levenshtein": "~2.0.6",
-            "levn": "~0.3.0",
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2",
-            "word-wrap": "~1.2.3"
-          }
-        },
-        "prelude-ls": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-          "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w=="
-        },
-        "saxes": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
-          "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
-          "requires": {
-            "xmlchars": "^2.2.0"
-          }
-        },
-        "type-check": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-          "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-          "requires": {
-            "prelude-ls": "~1.1.2"
-          }
-        },
-        "w3c-xmlserializer": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
-          "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
-          "requires": {
-            "xml-name-validator": "^4.0.0"
-          }
-        },
-        "whatwg-encoding": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
-          "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
-          "requires": {
-            "iconv-lite": "0.6.3"
-          }
-        },
-        "whatwg-mimetype": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
-          "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q=="
-        }
-      }
-    },
-    "jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true
-    },
-    "json-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
-    },
-    "json-parse-even-better-errors": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
-      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
-    },
-    "json-schema": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
-      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
-      "optional": true
-    },
-    "json-schema-traverse": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
-      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "devOptional": true
-    },
-    "json-stable-stringify-without-jsonify": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
-      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
-      "dev": true
-    },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
-      "optional": true
-    },
-    "json5": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
-      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-      "dev": true
-    },
-    "jsprim": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
-      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
-      "optional": true,
-      "requires": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.4.0",
-        "verror": "1.10.0"
-      }
-    },
-    "keyv": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
-      "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
-      "requires": {
-        "json-buffer": "3.0.1"
-      }
-    },
-    "kleur": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
-      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
-      "dev": true
-    },
-    "leven": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
-      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
-      "dev": true
-    },
-    "levn": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
-      "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1",
-        "type-check": "~0.4.0"
-      }
-    },
-    "libxmljs2": {
-      "version": "0.31.0",
-      "resolved": "https://registry.npmjs.org/libxmljs2/-/libxmljs2-0.31.0.tgz",
-      "integrity": "sha512-+o8y4lhmmf7zUA67watbLcAcxE0lkBkuatoIwgFkWTmuFTPEOZKunNpSjW6V7ONzAj8Ey1qVeR12q1JMU/sTlQ==",
-      "dev": true,
-      "requires": {
-        "@mapbox/node-pre-gyp": "^1.0.10",
-        "bindings": "~1.5.0",
-        "nan": "~2.17.0"
-      }
-    },
-    "lines-and-columns": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
-      "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
-    },
-    "linguist-js": {
-      "version": "2.5.4",
-      "resolved": "https://registry.npmjs.org/linguist-js/-/linguist-js-2.5.4.tgz",
-      "integrity": "sha512-sn0TNXtwizY8RElyN//O11b2Z7H0e/sYwIJzC39sxC+Keb4oD3QlFfBEL0iVNh7CLnZeONzIEWYxCe3x5wn+2g==",
-      "requires": {
-        "binary-extensions": "^2.2.0",
-        "commander": "^9.5.0",
-        "common-path-prefix": "^3.0.0",
-        "cross-fetch": "^3.1.5",
-        "ignore": "^5.2.4",
-        "isbinaryfile": "^4.0.8 <5",
-        "js-yaml": "^4.1.0",
-        "node-cache": "^5.1.2"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "9.5.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
-          "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ=="
-        }
-      }
-    },
-    "locate-path": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
-      "dev": true,
-      "requires": {
-        "p-locate": "^4.1.0"
-      }
-    },
-    "lodash.merge": {
-      "version": "4.6.2",
-      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
-      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
-      "dev": true
-    },
-    "lowercase-keys": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
-      "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="
-    },
-    "lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "magic-string": {
-      "version": "0.22.5",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
-      "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
-      "optional": true,
-      "requires": {
-        "vlq": "^0.2.2"
-      }
-    },
-    "make-dir": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-      "devOptional": true,
-      "requires": {
-        "semver": "^6.0.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "devOptional": true
-        }
-      }
-    },
-    "makeerror": {
-      "version": "1.0.12",
-      "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
-      "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
-      "dev": true,
-      "requires": {
-        "tmpl": "1.0.5"
-      }
-    },
-    "map-o": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/map-o/-/map-o-2.0.10.tgz",
-      "integrity": "sha512-BxazE81fVByHWasyXhqKeo2m7bFKYu+ZbEfiuexMOnklXW+tzDvnlTi/JaklEeuuwqcqJzPaf9q+TWptSGXeLg==",
-      "requires": {
-        "iterate-object": "^1.3.0"
-      }
-    },
-    "marked": {
-      "version": "4.2.12",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
-      "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw=="
-    },
-    "matchmedia": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/matchmedia/-/matchmedia-0.1.2.tgz",
-      "integrity": "sha512-ylpxHN2LdORLPJ62MAMBS1aXgwJYg4RunqwtQfREaAW6AV8wuPKb+6Ab+oE96npCaW2hVHZSmh3eIjOaYc4Fkw==",
-      "optional": true,
-      "requires": {
-        "css-mediaquery": "^0.1.2"
-      }
-    },
-    "mdn-data": {
-      "version": "2.0.28",
-      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
-      "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="
-    },
-    "media-typer": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
-      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
-    },
-    "memory-cache": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz",
-      "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA=="
-    },
-    "merge-descriptors": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
-      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
-    },
-    "merge-source-map": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz",
-      "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==",
-      "optional": true,
-      "requires": {
-        "source-map": "^0.5.6"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.5.7",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-          "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
-          "optional": true
-        }
-      }
-    },
-    "merge-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
-      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
-      "dev": true
-    },
-    "methods": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
-      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
-    },
-    "micromatch": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
-      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
-      "dev": true,
-      "requires": {
-        "braces": "^3.0.2",
-        "picomatch": "^2.3.1"
-      }
-    },
-    "mime": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
-      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
-    },
-    "mime-db": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
-    },
-    "mime-types": {
-      "version": "2.1.35",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "requires": {
-        "mime-db": "1.52.0"
-      }
-    },
-    "mimic-fn": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
-      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
-      "dev": true
-    },
-    "mimic-response": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
-      "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="
-    },
-    "minimatch": {
-      "version": "6.1.6",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.1.6.tgz",
-      "integrity": "sha512-6bR3UIeh/DF8+p6A9Spyuy67ShOq42rOkHWi7eUe3Ua99Zo5lZfGC6lJJWkeoK4k9jQFT3Pl7czhTXimG2XheA==",
-      "requires": {
-        "brace-expansion": "^2.0.1"
-      }
-    },
-    "minimist": {
-      "version": "1.2.6",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
-      "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
-    },
-    "minipass": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
-      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
-      "devOptional": true,
-      "requires": {
-        "yallist": "^4.0.0"
-      }
-    },
-    "minizlib": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-      "devOptional": true,
-      "requires": {
-        "minipass": "^3.0.0",
-        "yallist": "^4.0.0"
-      }
-    },
-    "mkdirp-classic": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
-      "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-    },
-    "nan": {
-      "version": "2.17.0",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz",
-      "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==",
-      "devOptional": true
-    },
-    "nanoid": {
-      "version": "3.3.4",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
-      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
-    },
-    "napi-build-utils": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz",
-      "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg=="
-    },
-    "natural-compare": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
-      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
-      "dev": true
-    },
-    "negotiator": {
-      "version": "0.6.3",
-      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
-      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
-    },
-    "node-abi": {
-      "version": "3.22.0",
-      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.22.0.tgz",
-      "integrity": "sha512-u4uAs/4Zzmp/jjsD9cyFYDXeISfUWaAVWshPmDZOFOv4Xl4SbzTXm53I04C2uRueYJ+0t5PEtLH/owbn2Npf/w==",
-      "requires": {
-        "semver": "^7.3.5"
-      }
-    },
-    "node-addon-api": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz",
-      "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA=="
-    },
-    "node-cache": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz",
-      "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==",
-      "requires": {
-        "clone": "2.x"
-      }
-    },
-    "node-chartist": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/node-chartist/-/node-chartist-1.0.5.tgz",
-      "integrity": "sha512-xtdGZRUlzoXx0UbctlFapEjFqubpcyksNTn6oNck3iE3d2oYqW4s2SH8LSyYpgYQqEe3qSdQW370K8P0WF2fNw==",
-      "optional": true,
-      "requires": {
-        "@panosoft/ramda-utils": "^0.2.8",
-        "brfs": "^1.4.3",
-        "chartist": "^0.11.0",
-        "chartist-plugin-axistitle": "0.0.1",
-        "co": "^4.6.0",
-        "is_js": "^0.9.0",
-        "jsdom": "^9.0.0",
-        "matchmedia": "^0.1.2",
-        "promisify-node": "^0.2.1",
-        "ramda": "^0.18.0",
-        "underscore.string": "^3.3.4"
-      },
-      "dependencies": {
-        "abab": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
-          "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==",
-          "optional": true
-        },
-        "acorn": {
-          "version": "4.0.13",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
-          "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==",
-          "optional": true
-        },
-        "acorn-globals": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
-          "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==",
-          "optional": true,
-          "requires": {
-            "acorn": "^4.0.4"
-          }
-        },
-        "cssom": {
-          "version": "0.3.8",
-          "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-          "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-          "optional": true
-        },
-        "cssstyle": {
-          "version": "0.2.37",
-          "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
-          "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==",
-          "optional": true,
-          "requires": {
-            "cssom": "0.3.x"
-          }
-        },
-        "html-encoding-sniffer": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
-          "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
-          "optional": true,
-          "requires": {
-            "whatwg-encoding": "^1.0.1"
-          }
-        },
-        "jsdom": {
-          "version": "9.12.0",
-          "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz",
-          "integrity": "sha512-Qw4oqNxo4LyzkSqVIyCnEltTc4xV3g1GBaI88AvYTesWzmWHUSoMNmhBjUBa+6ldXIBJS9xoeLNJPfUAykTyxw==",
-          "optional": true,
-          "requires": {
-            "abab": "^1.0.3",
-            "acorn": "^4.0.4",
-            "acorn-globals": "^3.1.0",
-            "array-equal": "^1.0.0",
-            "content-type-parser": "^1.0.1",
-            "cssom": ">= 0.3.2 < 0.4.0",
-            "cssstyle": ">= 0.2.37 < 0.3.0",
-            "escodegen": "^1.6.1",
-            "html-encoding-sniffer": "^1.0.1",
-            "nwmatcher": ">= 1.3.9 < 2.0.0",
-            "parse5": "^1.5.1",
-            "request": "^2.79.0",
-            "sax": "^1.2.1",
-            "symbol-tree": "^3.2.1",
-            "tough-cookie": "^2.3.2",
-            "webidl-conversions": "^4.0.0",
-            "whatwg-encoding": "^1.0.1",
-            "whatwg-url": "^4.3.0",
-            "xml-name-validator": "^2.0.1"
-          }
-        },
-        "parse5": {
-          "version": "1.5.1",
-          "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
-          "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==",
-          "optional": true
-        },
-        "tough-cookie": {
-          "version": "2.5.0",
-          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-          "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-          "optional": true,
-          "requires": {
-            "psl": "^1.1.28",
-            "punycode": "^2.1.1"
-          }
-        },
-        "webidl-conversions": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
-          "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
-          "optional": true
-        },
-        "whatwg-url": {
-          "version": "4.8.0",
-          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz",
-          "integrity": "sha512-nUvUPuenPFtPfy/X+dAYh/TfRbTBlnXTM5iIfLseJFkkQewmpG9pGR6i87E9qL+lZaJzv+99kkQWoGOtLfkZQQ==",
-          "optional": true,
-          "requires": {
-            "tr46": "~0.0.3",
-            "webidl-conversions": "^3.0.0"
-          },
-          "dependencies": {
-            "webidl-conversions": {
-              "version": "3.0.1",
-              "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-              "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
-              "optional": true
-            }
-          }
-        },
-        "xml-name-validator": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
-          "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==",
-          "optional": true
-        }
-      }
-    },
-    "node-domexception": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
-      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="
-    },
-    "node-fetch": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz",
-      "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==",
-      "requires": {
-        "data-uri-to-buffer": "^4.0.0",
-        "fetch-blob": "^3.1.4",
-        "formdata-polyfill": "^4.0.10"
-      }
-    },
-    "node-int64": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
-      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
-      "dev": true
-    },
-    "node-releases": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
-      "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
-      "dev": true
-    },
-    "nodegit-promise": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-3.0.3.tgz",
-      "integrity": "sha512-g9xU8ORtPJFC+RfwU6xoXtZ024OLINsRSF1ihP75dIYNFfQJX/7yHaMaNo7WidRs9f/SC+0ZP47+kTRWwDQ+AA==",
-      "optional": true,
-      "requires": {
-        "asap": "~2.0.3"
-      }
-    },
-    "nopt": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
-      "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
-      "devOptional": true,
-      "requires": {
-        "abbrev": "1"
-      }
-    },
-    "normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true
-    },
-    "normalize-url": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
-      "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw=="
-    },
-    "npm-run-path": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
-      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
-      "dev": true,
-      "requires": {
-        "path-key": "^3.0.0"
-      }
-    },
-    "npmlog": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
-      "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
-      "devOptional": true,
-      "requires": {
-        "are-we-there-yet": "^2.0.0",
-        "console-control-strings": "^1.1.0",
-        "gauge": "^3.0.0",
-        "set-blocking": "^2.0.0"
-      }
-    },
-    "nth-check": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
-      "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
-      "requires": {
-        "boolbase": "^1.0.0"
-      }
-    },
-    "nwmatcher": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
-      "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
-      "optional": true
-    },
-    "nwsapi": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz",
-      "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw=="
-    },
-    "oauth-sign": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "optional": true
-    },
-    "object-assign": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-    },
-    "object-inspect": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz",
-      "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==",
-      "optional": true
-    },
-    "on-finished": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
-      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
-      "requires": {
-        "ee-first": "1.1.1"
-      }
-    },
-    "on-headers": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
-      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "onetime": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
-      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
-      "dev": true,
-      "requires": {
-        "mimic-fn": "^2.1.0"
-      }
-    },
-    "open-graph-scraper": {
-      "version": "5.0.3",
-      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-5.0.3.tgz",
-      "integrity": "sha512-TwDOwvQlm6h14chfjyzBXCHhW99SIU399cRQBcx0mxzl1fvIjDTlWVwAN2q7+A8YTfuvXoV2fwAYI+HmVVw5pg==",
-      "requires": {
-        "chardet": "^1.5.0",
-        "cheerio": "^1.0.0-rc.12",
-        "got": "^12.5.3",
-        "iconv-lite": "^0.6.3",
-        "validator": "^13.7.0"
-      },
-      "dependencies": {
-        "iconv-lite": {
-          "version": "0.6.3",
-          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
-          "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
-          "requires": {
-            "safer-buffer": ">= 2.1.2 < 3.0.0"
-          }
-        }
-      }
-    },
-    "optionator": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
-      "dev": true,
-      "requires": {
-        "deep-is": "^0.1.3",
-        "fast-levenshtein": "^2.0.6",
-        "levn": "^0.4.1",
-        "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
-      }
-    },
-    "p-cancelable": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
-      "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="
-    },
-    "p-limit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-      "dev": true,
-      "requires": {
-        "yocto-queue": "^0.1.0"
-      }
-    },
-    "p-locate": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
-      "dev": true,
-      "requires": {
-        "p-limit": "^2.2.0"
-      },
-      "dependencies": {
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        }
-      }
-    },
-    "p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true
-    },
-    "parent-module": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
-      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
-      "requires": {
-        "callsites": "^3.0.0"
-      }
-    },
-    "parse-json": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
-      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
-      "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "error-ex": "^1.3.1",
-        "json-parse-even-better-errors": "^2.3.0",
-        "lines-and-columns": "^1.1.6"
-      }
-    },
-    "parse-srcset": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
-      "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE="
-    },
-    "parse5": {
-      "version": "7.1.2",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
-      "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
-      "requires": {
-        "entities": "^4.4.0"
-      },
-      "dependencies": {
-        "entities": {
-          "version": "4.4.0",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-          "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA=="
-        }
-      }
-    },
-    "parse5-htmlparser2-tree-adapter": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
-      "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
-      "requires": {
-        "domhandler": "^5.0.2",
-        "parse5": "^7.0.0"
-      }
-    },
-    "parseurl": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
-      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
-    },
-    "path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-    },
-    "path-key": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
-      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "devOptional": true
-    },
-    "path-to-regexp": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
-      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
-    },
-    "path-type": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
-    },
-    "peek-readable": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz",
-      "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A=="
-    },
-    "pend": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="
-    },
-    "performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
-      "optional": true
-    },
-    "picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
-    },
-    "picomatch": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
-      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
-      "dev": true
-    },
-    "pirates": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
-      "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
-      "dev": true
-    },
-    "pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-      "dev": true,
-      "requires": {
-        "find-up": "^4.0.0"
-      }
-    },
-    "png-js": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz",
-      "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
-    },
-    "postcss": {
-      "version": "8.4.14",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
-      "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
-      "requires": {
-        "nanoid": "^3.3.4",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
-      }
-    },
-    "postcss-selector-parser": {
-      "version": "6.0.10",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
-      "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
-      "requires": {
-        "cssesc": "^3.0.0",
-        "util-deprecate": "^1.0.2"
-      }
-    },
-    "prebuild-install": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
-      "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
-      "requires": {
-        "detect-libc": "^2.0.0",
-        "expand-template": "^2.0.3",
-        "github-from-package": "0.0.0",
-        "minimist": "^1.2.3",
-        "mkdirp-classic": "^0.5.3",
-        "napi-build-utils": "^1.0.1",
-        "node-abi": "^3.3.0",
-        "pump": "^3.0.0",
-        "rc": "^1.2.7",
-        "simple-get": "^4.0.0",
-        "tar-fs": "^2.0.0",
-        "tunnel-agent": "^0.6.0"
-      },
-      "dependencies": {
-        "simple-get": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
-          "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
-          "requires": {
-            "decompress-response": "^6.0.0",
-            "once": "^1.3.1",
-            "simple-concat": "^1.0.0"
-          }
-        }
-      }
-    },
-    "prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true
-    },
-    "pretty-format": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
-      "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
-      "dev": true,
-      "requires": {
-        "@jest/schemas": "^29.4.3",
-        "ansi-styles": "^5.0.0",
-        "react-is": "^18.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
-          "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
-          "dev": true
-        }
-      }
-    },
-    "prismjs": {
-      "version": "1.29.0",
-      "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz",
-      "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q=="
-    },
-    "process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "optional": true
-    },
-    "progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
-    },
-    "promisify-node": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.2.1.tgz",
-      "integrity": "sha512-eKqupYBxdDPbn9vyCng7KCw9a4VtUMIKG799k4ufS1F2Pn9PzzGVsuzRLO51FtbXN8wH2SWHq+gK27RRRr+xqw==",
-      "optional": true,
-      "requires": {
-        "nodegit-promise": "~3.0.2"
-      }
-    },
-    "prompts": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
-      "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
-      "dev": true,
-      "requires": {
-        "kleur": "^3.0.3",
-        "sisteransi": "^1.0.5"
-      }
-    },
-    "proxy-addr": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
-      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
-      "requires": {
-        "forwarded": "0.2.0",
-        "ipaddr.js": "1.9.1"
-      }
-    },
-    "proxy-from-env": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
-    },
-    "psl": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
-      "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag=="
-    },
-    "pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
-      "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
-      }
-    },
-    "punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
-    },
-    "puppeteer": {
-      "version": "19.5.2",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.5.2.tgz",
-      "integrity": "sha512-xlqRyrhXhVH114l79Y0XqYXUVG+Yfw4sKlvN55t8Y9DxtA5fzI1uqF8SVXbWK5DUMbD6Jo4lpixTZCTTZGD05g==",
-      "requires": {
-        "cosmiconfig": "8.0.0",
-        "https-proxy-agent": "5.0.1",
-        "progress": "2.0.3",
-        "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.5.2"
-      }
-    },
-    "puppeteer-core": {
-      "version": "19.5.2",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.5.2.tgz",
-      "integrity": "sha512-Rqk+3kqM+Z2deooTYqcYt8lRtGffJdifWa9td9nbJSjhANWsFouk8kLBNUKycewCCFHM8TZUKS0x28OllavW2A==",
-      "requires": {
-        "cross-fetch": "3.1.5",
-        "debug": "4.3.4",
-        "devtools-protocol": "0.0.1068969",
-        "extract-zip": "2.0.1",
-        "https-proxy-agent": "5.0.1",
-        "proxy-from-env": "1.1.0",
-        "rimraf": "3.0.2",
-        "tar-fs": "2.1.1",
-        "unbzip2-stream": "1.4.3",
-        "ws": "8.11.0"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        }
-      }
-    },
-    "pure-rand": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz",
-      "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==",
-      "dev": true
-    },
-    "purgecss": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-5.0.0.tgz",
-      "integrity": "sha512-RAnuxrGuVyLLTr8uMbKaxDRGWMgK5CCYDfRyUNNcaz5P3kGgD2b7ymQGYEyo2ST7Tl/ScwFgf5l3slKMxHSbrw==",
-      "requires": {
-        "commander": "^9.0.0",
-        "glob": "^8.0.3",
-        "postcss": "^8.4.4",
-        "postcss-selector-parser": "^6.0.7"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "9.4.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-9.4.0.tgz",
-          "integrity": "sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw=="
-        },
-        "glob": {
-          "version": "8.0.3",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz",
-          "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==",
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^5.0.1",
-            "once": "^1.3.0"
-          }
-        },
-        "minimatch": {
-          "version": "5.1.4",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.4.tgz",
-          "integrity": "sha512-U0iNYXt9wALljzfnGkhFSy5sAC6/SCR3JrHrlsdJz4kF8MvhTRQNiC59iUi1iqsitV7abrNAJWElVL9pdnoUgw==",
-          "requires": {
-            "brace-expansion": "^2.0.1"
-          }
-        }
-      }
-    },
-    "qs": {
-      "version": "6.11.0",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
-      "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
-      "requires": {
-        "side-channel": "^1.0.4"
-      }
-    },
-    "query-string": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz",
-      "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==",
-      "optional": true,
-      "requires": {
-        "decode-uri-component": "^0.2.2",
-        "filter-obj": "^1.1.0",
-        "split-on-first": "^1.0.0",
-        "strict-uri-encode": "^2.0.0"
-      }
-    },
-    "querystringify": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
-      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
-    },
-    "queue-microtask": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
-      "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
-      "dev": true
-    },
-    "quick-lru": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
-    },
-    "quote-stream": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
-      "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==",
-      "optional": true,
-      "requires": {
-        "buffer-equal": "0.0.1",
-        "minimist": "^1.1.3",
-        "through2": "^2.0.0"
-      }
-    },
-    "ramda": {
-      "version": "0.18.0",
-      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.18.0.tgz",
-      "integrity": "sha512-bSgBktaZE0uDH5KmMpbizsxSNcw9MumqtouUVUrxHZSunm+WdDc/UlzwWFtgqMfngX7TZ12d9QsyWkYK7OoJSw==",
-      "optional": true
-    },
-    "range-parser": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
-      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
-    },
-    "raw-body": {
-      "version": "2.5.1",
-      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
-      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
-      "requires": {
-        "bytes": "3.1.2",
-        "http-errors": "2.0.0",
-        "iconv-lite": "0.4.24",
-        "unpipe": "1.0.0"
-      },
-      "dependencies": {
-        "bytes": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
-          "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
-        }
-      }
-    },
-    "rc": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
-      "requires": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
-      },
-      "dependencies": {
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-          "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="
-        }
-      }
-    },
-    "react-is": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
-      "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
-      "dev": true
-    },
-    "readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
-      "optional": true,
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-          "optional": true
-        }
-      }
-    },
-    "readable-web-to-node-stream": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz",
-      "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==",
-      "requires": {
-        "readable-stream": "^3.6.0"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.6.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        }
-      }
-    },
-    "regexpp": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
-      "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
-      "dev": true
-    },
-    "request": {
-      "version": "2.88.2",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
-      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
-      "optional": true,
-      "requires": {
-        "aws-sign2": "~0.7.0",
-        "aws4": "^1.8.0",
-        "caseless": "~0.12.0",
-        "combined-stream": "~1.0.6",
-        "extend": "~3.0.2",
-        "forever-agent": "~0.6.1",
-        "form-data": "~2.3.2",
-        "har-validator": "~5.1.3",
-        "http-signature": "~1.2.0",
-        "is-typedarray": "~1.0.0",
-        "isstream": "~0.1.2",
-        "json-stringify-safe": "~5.0.1",
-        "mime-types": "~2.1.19",
-        "oauth-sign": "~0.9.0",
-        "performance-now": "^2.1.0",
-        "qs": "~6.5.2",
-        "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.5.0",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^3.3.2"
-      },
-      "dependencies": {
-        "form-data": {
-          "version": "2.3.3",
-          "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-          "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-          "optional": true,
-          "requires": {
-            "asynckit": "^0.4.0",
-            "combined-stream": "^1.0.6",
-            "mime-types": "^2.1.12"
-          }
-        },
-        "qs": {
-          "version": "6.5.3",
-          "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
-          "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
-          "optional": true
-        },
-        "tough-cookie": {
-          "version": "2.5.0",
-          "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-          "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-          "optional": true,
-          "requires": {
-            "psl": "^1.1.28",
-            "punycode": "^2.1.1"
-          }
-        }
-      }
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-      "dev": true
-    },
-    "requires-port": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
-      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
-    },
-    "resolve": {
-      "version": "1.20.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
-      "devOptional": true,
-      "requires": {
-        "is-core-module": "^2.2.0",
-        "path-parse": "^1.0.6"
-      }
-    },
-    "resolve-alpn": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
-      "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
-    },
-    "resolve-cwd": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
-      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
-      "dev": true,
-      "requires": {
-        "resolve-from": "^5.0.0"
-      },
-      "dependencies": {
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-          "dev": true
-        }
-      }
-    },
-    "resolve-from": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
-    },
-    "resolve.exports": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz",
-      "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==",
-      "dev": true
-    },
-    "responselike": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
-      "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
-      "requires": {
-        "lowercase-keys": "^3.0.0"
-      }
-    },
-    "retry-axios": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-2.6.0.tgz",
-      "integrity": "sha512-pOLi+Gdll3JekwuFjXO3fTq+L9lzMQGcSq7M5gIjExcl3Gu1hd4XXuf5o3+LuSBsaULQH7DiNbsqPd1chVpQGQ==",
-      "optional": true,
-      "requires": {}
-    },
-    "reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true
-    },
-    "rimraf": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-      "requires": {
-        "glob": "^7.1.3"
-      }
-    },
-    "robust-predicates": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz",
-      "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g=="
-    },
-    "rss": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/rss/-/rss-1.2.2.tgz",
-      "integrity": "sha512-xUhRTgslHeCBeHAqaWSbOYTydN2f0tAzNXvzh3stjz7QDhQMzdgHf3pfgNIngeytQflrFPfy6axHilTETr6gDg==",
-      "optional": true,
-      "requires": {
-        "mime-types": "2.1.13",
-        "xml": "1.0.1"
-      },
-      "dependencies": {
-        "mime-db": {
-          "version": "1.25.0",
-          "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.25.0.tgz",
-          "integrity": "sha512-5k547tI4Cy+Lddr/hdjNbBEWBwSl8EBc5aSdKvedav8DReADgWJzcYiktaRIw3GtGC1jjwldXtTzvqJZmtvC7w==",
-          "optional": true
-        },
-        "mime-types": {
-          "version": "2.1.13",
-          "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.13.tgz",
-          "integrity": "sha512-ryBDp1Z/6X90UvjUK3RksH0IBPM137T7cmg4OgD5wQBojlAiUwuok0QeELkim/72EtcYuNlmbkrcGuxj3Kl0YQ==",
-          "optional": true,
-          "requires": {
-            "mime-db": "~1.25.0"
-          }
-        }
-      }
-    },
-    "rss-parser": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz",
-      "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==",
-      "requires": {
-        "entities": "^2.0.3",
-        "xml2js": "^0.4.19"
-      }
-    },
-    "run-parallel": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
-      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
-      "dev": true,
-      "requires": {
-        "queue-microtask": "^1.2.2"
-      }
-    },
-    "rw": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
-      "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="
-    },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-    },
-    "sanitize-html": {
-      "version": "2.8.1",
-      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.8.1.tgz",
-      "integrity": "sha512-qK5neD0SaMxGwVv5txOYv05huC3o6ZAA4h5+7nJJgWMNFUNRjcjLO6FpwAtKzfKCZ0jrG6xTk6eVFskbvOGblg==",
-      "requires": {
-        "deepmerge": "^4.2.2",
-        "escape-string-regexp": "^4.0.0",
-        "htmlparser2": "^8.0.0",
-        "is-plain-object": "^5.0.0",
-        "parse-srcset": "^1.0.2",
-        "postcss": "^8.3.11"
-      }
-    },
-    "sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
-    },
-    "select": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
-      "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0="
-    },
-    "semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-      "requires": {
-        "lru-cache": "^6.0.0"
-      }
-    },
-    "send": {
-      "version": "0.18.0",
-      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
-      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
-      "requires": {
-        "debug": "2.6.9",
-        "depd": "2.0.0",
-        "destroy": "1.2.0",
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "etag": "~1.8.1",
-        "fresh": "0.5.2",
-        "http-errors": "2.0.0",
-        "mime": "1.6.0",
-        "ms": "2.1.3",
-        "on-finished": "2.4.1",
-        "range-parser": "~1.2.1",
-        "statuses": "2.0.1"
-      },
-      "dependencies": {
-        "ms": {
-          "version": "2.1.3",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
-          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
-        }
-      }
-    },
-    "serve-static": {
-      "version": "1.15.0",
-      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
-      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
-      "requires": {
-        "encodeurl": "~1.0.2",
-        "escape-html": "~1.0.3",
-        "parseurl": "~1.3.3",
-        "send": "0.18.0"
-      }
-    },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "devOptional": true
-    },
-    "setprototypeof": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
-      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
-    },
-    "shallow-copy": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
-      "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==",
-      "optional": true
-    },
-    "sharp": {
-      "version": "0.31.3",
-      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz",
-      "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==",
-      "requires": {
-        "color": "^4.2.3",
-        "detect-libc": "^2.0.1",
-        "node-addon-api": "^5.0.0",
-        "prebuild-install": "^7.1.1",
-        "semver": "^7.3.8",
-        "simple-get": "^4.0.1",
-        "tar-fs": "^2.1.1",
-        "tunnel-agent": "^0.6.0"
-      },
-      "dependencies": {
-        "simple-get": {
-          "version": "4.0.1",
-          "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
-          "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
-          "requires": {
-            "decompress-response": "^6.0.0",
-            "once": "^1.3.1",
-            "simple-concat": "^1.0.0"
-          }
-        }
-      }
-    },
-    "shebang-command": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
-      "dev": true,
-      "requires": {
-        "shebang-regex": "^3.0.0"
-      }
-    },
-    "shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
-      "dev": true
-    },
-    "side-channel": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
-      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
-      "requires": {
-        "call-bind": "^1.0.0",
-        "get-intrinsic": "^1.0.2",
-        "object-inspect": "^1.9.0"
-      },
-      "dependencies": {
-        "object-inspect": {
-          "version": "1.12.2",
-          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
-          "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
-        }
-      }
-    },
-    "signal-exit": {
-      "version": "3.0.7",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
-      "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
-      "devOptional": true
-    },
-    "simple-concat": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
-      "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
-    },
-    "simple-get": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
-      "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
-      "optional": true,
-      "requires": {
-        "decompress-response": "^4.2.0",
-        "once": "^1.3.1",
-        "simple-concat": "^1.0.0"
-      },
-      "dependencies": {
-        "decompress-response": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
-          "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
-          "optional": true,
-          "requires": {
-            "mimic-response": "^2.0.0"
-          }
-        },
-        "mimic-response": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
-          "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
-          "optional": true
-        }
-      }
-    },
-    "simple-git": {
-      "version": "3.16.0",
-      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.16.0.tgz",
-      "integrity": "sha512-zuWYsOLEhbJRWVxpjdiXl6eyAyGo/KzVW+KFhhw9MqEEJttcq+32jTWSGyxTdf9e/YCohxRE+9xpWFj9FdiJNw==",
-      "requires": {
-        "@kwsites/file-exists": "^1.1.1",
-        "@kwsites/promise-deferred": "^1.1.1",
-        "debug": "^4.3.4"
-      },
-      "dependencies": {
-        "debug": {
-          "version": "4.3.4",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-          "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
-          "requires": {
-            "ms": "2.1.2"
-          }
-        },
-        "ms": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
-        }
-      }
-    },
-    "simple-swizzle": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
-      "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
-      "requires": {
-        "is-arrayish": "^0.3.1"
-      },
-      "dependencies": {
-        "is-arrayish": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
-          "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
-        }
-      }
-    },
-    "sisteransi": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
-      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
-      "dev": true
-    },
-    "slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true
-    },
-    "source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-    },
-    "source-map-js": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
-    },
-    "source-map-support": {
-      "version": "0.5.13",
-      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
-      "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      }
-    },
-    "split-on-first": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
-      "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==",
-      "optional": true
-    },
-    "sprintf-js": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
-      "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
-      "optional": true
-    },
-    "sshpk": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
-      "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
-      "optional": true,
-      "requires": {
-        "asn1": "~0.2.3",
-        "assert-plus": "^1.0.0",
-        "bcrypt-pbkdf": "^1.0.0",
-        "dashdash": "^1.12.0",
-        "ecc-jsbn": "~0.1.1",
-        "getpass": "^0.1.1",
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.0.2",
-        "tweetnacl": "~0.14.0"
-      }
-    },
-    "stack-utils": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
-      "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
-      "dev": true,
-      "requires": {
-        "escape-string-regexp": "^2.0.0"
-      },
-      "dependencies": {
-        "escape-string-regexp": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
-          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
-          "dev": true
-        }
-      }
-    },
-    "static-eval": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
-      "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
-      "optional": true,
-      "requires": {
-        "escodegen": "^1.11.1"
-      }
-    },
-    "static-module": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz",
-      "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==",
-      "optional": true,
-      "requires": {
-        "concat-stream": "~1.6.0",
-        "convert-source-map": "^1.5.1",
-        "duplexer2": "~0.1.4",
-        "escodegen": "~1.9.0",
-        "falafel": "^2.1.0",
-        "has": "^1.0.1",
-        "magic-string": "^0.22.4",
-        "merge-source-map": "1.0.4",
-        "object-inspect": "~1.4.0",
-        "quote-stream": "~1.0.2",
-        "readable-stream": "~2.3.3",
-        "shallow-copy": "~0.0.1",
-        "static-eval": "^2.0.0",
-        "through2": "~2.0.3"
-      },
-      "dependencies": {
-        "escodegen": {
-          "version": "1.9.1",
-          "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
-          "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
-          "optional": true,
-          "requires": {
-            "esprima": "^3.1.3",
-            "estraverse": "^4.2.0",
-            "esutils": "^2.0.2",
-            "optionator": "^0.8.1",
-            "source-map": "~0.6.1"
-          }
-        },
-        "esprima": {
-          "version": "3.1.3",
-          "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
-          "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==",
-          "optional": true
-        },
-        "estraverse": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-          "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-          "optional": true
-        },
-        "levn": {
-          "version": "0.3.0",
-          "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-          "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-          "optional": true,
-          "requires": {
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2"
-          }
-        },
-        "optionator": {
-          "version": "0.8.3",
-          "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-          "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-          "optional": true,
-          "requires": {
-            "deep-is": "~0.1.3",
-            "fast-levenshtein": "~2.0.6",
-            "levn": "~0.3.0",
-            "prelude-ls": "~1.1.2",
-            "type-check": "~0.3.2",
-            "word-wrap": "~1.2.3"
-          }
-        },
-        "prelude-ls": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-          "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
-          "optional": true
-        },
-        "type-check": {
-          "version": "0.3.2",
-          "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-          "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-          "optional": true,
-          "requires": {
-            "prelude-ls": "~1.1.2"
-          }
-        }
-      }
-    },
-    "statuses": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
-      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
-    },
-    "strict-uri-encode": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
-      "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==",
-      "optional": true
-    },
-    "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "string-length": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
-      "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
-      "dev": true,
-      "requires": {
-        "char-regex": "^1.0.2",
-        "strip-ansi": "^6.0.0"
-      }
-    },
-    "string-width": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
-      "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "devOptional": true,
-      "requires": {
-        "emoji-regex": "^8.0.0",
-        "is-fullwidth-code-point": "^3.0.0",
-        "strip-ansi": "^6.0.1"
-      }
-    },
-    "strip-ansi": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
-      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "devOptional": true,
-      "requires": {
-        "ansi-regex": "^5.0.1"
-      }
-    },
-    "strip-bom": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
-      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
-      "dev": true
-    },
-    "strip-final-newline": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
-      "dev": true
-    },
-    "strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true
-    },
-    "strtok3": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz",
-      "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==",
-      "requires": {
-        "@tokenizer/token": "^0.3.0",
-        "peek-readable": "^5.0.0"
-      }
-    },
-    "supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "requires": {
-        "has-flag": "^4.0.0"
-      }
-    },
-    "svgo": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz",
-      "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==",
-      "requires": {
-        "@trysound/sax": "0.2.0",
-        "commander": "^7.2.0",
-        "css-select": "^5.1.0",
-        "css-tree": "^2.2.1",
-        "csso": "^5.0.5",
-        "picocolors": "^1.0.0"
-      }
-    },
-    "symbol-tree": {
-      "version": "3.2.4",
-      "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
-      "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
-    },
-    "tar": {
-      "version": "6.1.11",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
-      "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
-      "devOptional": true,
-      "requires": {
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.0.0",
-        "minipass": "^3.0.0",
-        "minizlib": "^2.1.1",
-        "mkdirp": "^1.0.3",
-        "yallist": "^4.0.0"
-      },
-      "dependencies": {
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "devOptional": true
-        }
-      }
-    },
-    "tar-fs": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
-      "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
-      "requires": {
-        "chownr": "^1.1.1",
-        "mkdirp-classic": "^0.5.2",
-        "pump": "^3.0.0",
-        "tar-stream": "^2.1.4"
-      },
-      "dependencies": {
-        "chownr": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
-        }
-      }
-    },
-    "tar-stream": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
-      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
-      "requires": {
-        "bl": "^4.0.3",
-        "end-of-stream": "^1.4.1",
-        "fs-constants": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^3.1.1"
-      },
-      "dependencies": {
-        "readable-stream": {
-          "version": "3.6.0",
-          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-          "requires": {
-            "inherits": "^2.0.3",
-            "string_decoder": "^1.1.1",
-            "util-deprecate": "^1.0.1"
-          }
-        }
-      }
-    },
-    "test-exclude": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
-      "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
-      "dev": true,
-      "requires": {
-        "@istanbuljs/schema": "^0.1.2",
-        "glob": "^7.1.4",
-        "minimatch": "^3.0.4"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "1.1.11",
-          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-          "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0",
-            "concat-map": "0.0.1"
-          }
-        },
-        "minimatch": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
-          "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^1.1.7"
-          }
-        }
-      }
-    },
-    "text-table": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
-      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
-      "dev": true
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
-    },
-    "through2": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-      "optional": true,
-      "requires": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "tiny-emitter": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
-      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
-    },
-    "tmpl": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
-      "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
-      "dev": true
-    },
-    "to-fast-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
-      "dev": true
-    },
-    "to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "requires": {
-        "is-number": "^7.0.0"
-      }
-    },
-    "toidentifier": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
-      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
-    },
-    "token-types": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz",
-      "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==",
-      "requires": {
-        "@tokenizer/token": "^0.3.0",
-        "ieee754": "^1.2.1"
-      }
-    },
-    "tough-cookie": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
-      "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
-      "requires": {
-        "psl": "^1.1.33",
-        "punycode": "^2.1.1",
-        "universalify": "^0.2.0",
-        "url-parse": "^1.5.3"
-      }
-    },
-    "tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
-    "tunnel": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
-      "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
-    },
-    "tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "requires": {
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
-      "optional": true
-    },
-    "type-check": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
-      "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
-      "dev": true,
-      "requires": {
-        "prelude-ls": "^1.2.1"
-      }
-    },
-    "type-detect": {
-      "version": "4.0.8",
-      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-      "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
-      "dev": true
-    },
-    "type-fest": {
-      "version": "0.20.2",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
-      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
-      "dev": true
-    },
-    "type-is": {
-      "version": "1.6.18",
-      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
-      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
-      "requires": {
-        "media-typer": "0.3.0",
-        "mime-types": "~2.1.24"
-      }
-    },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
-      "optional": true
-    },
-    "unbzip2-stream": {
-      "version": "1.4.3",
-      "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
-      "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
-      "requires": {
-        "buffer": "^5.2.1",
-        "through": "^2.3.8"
-      }
-    },
-    "underscore.string": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz",
-      "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==",
-      "optional": true,
-      "requires": {
-        "sprintf-js": "^1.1.1",
-        "util-deprecate": "^1.0.2"
-      }
-    },
-    "universal-user-agent": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
-      "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w=="
-    },
-    "universalify": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
-      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg=="
-    },
-    "unpipe": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
-      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
-    },
-    "update-browserslist-db": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
-      "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
-      "dev": true,
-      "requires": {
-        "escalade": "^3.1.1",
-        "picocolors": "^1.0.0"
-      }
-    },
-    "uri-js": {
-      "version": "4.4.1",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
-      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "devOptional": true,
-      "requires": {
-        "punycode": "^2.1.0"
-      }
-    },
-    "url-parse": {
-      "version": "1.5.10",
-      "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
-      "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
-      "requires": {
-        "querystringify": "^2.1.1",
-        "requires-port": "^1.0.0"
-      }
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "utils-merge": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
-      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
-    },
-    "uuid": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-      "optional": true
-    },
-    "v8-to-istanbul": {
-      "version": "9.1.0",
-      "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
-      "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
-      "dev": true,
-      "requires": {
-        "@jridgewell/trace-mapping": "^0.3.12",
-        "@types/istanbul-lib-coverage": "^2.0.1",
-        "convert-source-map": "^1.6.0"
-      }
-    },
-    "validator": {
-      "version": "13.7.0",
-      "resolved": "https://registry.npmjs.org/validator/-/validator-13.7.0.tgz",
-      "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw=="
-    },
-    "vary": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
-      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
-    },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
-      "optional": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      },
-      "dependencies": {
-        "core-util-is": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-          "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
-          "optional": true
-        }
-      }
-    },
-    "vlq": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
-      "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
-      "optional": true
-    },
-    "vue": {
-      "version": "2.7.1",
-      "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.1.tgz",
-      "integrity": "sha512-X1YkFddhbTAU2FPK0gBZ/vDOcOMA8ZT4uHoFVor1bUb7BpVGdEswS286YGtODsf/Ghfr1LM1sBMFAY8XT+dVhA==",
-      "requires": {
-        "@vue/compiler-sfc": "2.7.1",
-        "csstype": "^3.1.0"
-      }
-    },
-    "vue-prism-component": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/vue-prism-component/-/vue-prism-component-1.2.0.tgz",
-      "integrity": "sha512-0N9CNuQu+36CJpdsZHrhdq7d18oBvjVMjawyKdIr8xuzFWLfdxECZQYbFaYoopPBg3SvkEEMtkhYqdgTQl5Y+A=="
-    },
-    "walker": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
-      "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
-      "dev": true,
-      "requires": {
-        "makeerror": "1.0.12"
-      }
-    },
-    "web-streams-polyfill": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.1.1.tgz",
-      "integrity": "sha512-Czi3fG883e96T4DLEPRvufrF2ydhOOW1+1a6c3gNjH2aIh50DNFBdfwh2AKoOf1rXvpvavAoA11Qdq9+BKjE0Q=="
-    },
-    "webidl-conversions": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
-      "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g=="
-    },
-    "whatwg-encoding": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
-      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
-      "optional": true,
-      "requires": {
-        "iconv-lite": "0.4.24"
-      }
-    },
-    "whatwg-url": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
-      "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
-      "requires": {
-        "tr46": "^3.0.0",
-        "webidl-conversions": "^7.0.0"
-      },
-      "dependencies": {
-        "tr46": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
-          "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
-          "requires": {
-            "punycode": "^2.1.1"
-          }
-        }
-      }
-    },
-    "which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "wide-align": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
-      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
-      "devOptional": true,
-      "requires": {
-        "string-width": "^1.0.2 || 2 || 3 || 4"
-      }
-    },
-    "word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ=="
-    },
-    "wrap-ansi": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
-      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.0.0",
-        "string-width": "^4.1.0",
-        "strip-ansi": "^6.0.0"
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
-    "write-file-atomic": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
-      "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
-      "dev": true,
-      "requires": {
-        "imurmurhash": "^0.1.4",
-        "signal-exit": "^3.0.7"
-      }
-    },
-    "ws": {
-      "version": "8.11.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
-      "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
-      "requires": {}
-    },
-    "xml": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
-      "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==",
-      "optional": true
-    },
-    "xml-formatter": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-3.2.0.tgz",
-      "integrity": "sha512-PYROODIUDHz1SDFePg2VThajPOuSmvo/PrYRKARcSc9xxKKs62EN9uar60IIxxknzmOSNDAxlylpw34bQp0g/Q==",
-      "requires": {
-        "xml-parser-xo": "^4.0.1"
-      }
-    },
-    "xml-name-validator": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
-      "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="
-    },
-    "xml-parser-xo": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-4.0.1.tgz",
-      "integrity": "sha512-wJmRjzVZr7D+kYSajd3zqT7tt+y9L2vVWp+s7ARxzPMtk/gZcTY0KB14B801QX2D2wqIQ1d3bV/LgcnwlpKyyg=="
-    },
-    "xml2js": {
-      "version": "0.4.23",
-      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
-      "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
-      "requires": {
-        "sax": ">=0.6.0",
-        "xmlbuilder": "~11.0.0"
-      }
-    },
-    "xmlbuilder": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
-      "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA=="
-    },
-    "xmlchars": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
-      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
-    },
-    "xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "optional": true
-    },
-    "y18n": {
-      "version": "5.0.8",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
-      "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-      "dev": true
-    },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
-    "yargs": {
-      "version": "17.7.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
-      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
-      "dev": true,
-      "requires": {
-        "cliui": "^8.0.1",
-        "escalade": "^3.1.1",
-        "get-caller-file": "^2.0.5",
-        "require-directory": "^2.1.1",
-        "string-width": "^4.2.3",
-        "y18n": "^5.0.5",
-        "yargs-parser": "^21.1.1"
-      }
-    },
-    "yargs-parser": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
-      "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
-      "devOptional": true
-    },
-    "yauzl": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
-      "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
-      "requires": {
-        "buffer-crc32": "~0.2.3",
-        "fd-slicer": "~1.1.0"
-      }
-    },
-    "yocto-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-      "dev": true
-    }
   }
 }
diff --git a/package.json b/package.json
index 886f4a7f1e5..fca3afbad5d 100644
--- a/package.json
+++ b/package.json
@@ -32,46 +32,46 @@
     "@actions/core": "^1.10.0",
     "@actions/github": "^5.1.1",
     "@faker-js/faker": "^7.6.0",
-    "@octokit/graphql": "^5.0.4",
-    "@octokit/rest": "^19.0.5",
-    "@primer/css": "^20.8.0",
+    "@octokit/graphql": "^5.0.5",
+    "@octokit/rest": "^19.0.7",
+    "@primer/css": "^20.8.3",
     "@primer/octicons": "^18.2.0",
     "@twemoji/parser": "^14.1.0",
-    "axios": "^1.2.2",
+    "axios": "^1.3.4",
     "clipboard": "^2.0.11",
     "compression": "^1.7.4",
     "csso": "^5.0.5",
-    "d3": "^7.8.1",
-    "ejs": "^3.1.8",
+    "d3": "^7.8.2",
+    "ejs": "^3.1.9",
     "emoji-name-map": "^1.2.9",
     "express": "^4.18.2",
     "express-rate-limit": "^6.7.0",
-    "file-type": "^18.2.0",
+    "file-type": "^18.2.1",
     "js-yaml": "^4.1.0",
-    "jsdom": "^21.0.0",
+    "jsdom": "^21.1.1",
     "linguist-js": "^2.5.4",
     "marked": "^4.2.12",
     "memory-cache": "^0.2.0",
-    "minimatch": "^6.1.6",
-    "node-fetch": "^3.3.0",
-    "open-graph-scraper": "^5.0.3",
+    "minimatch": "^7.4.2",
+    "node-fetch": "^3.3.1",
+    "open-graph-scraper": "^5.1.1",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^19.5.2",
+    "puppeteer": "^19.7.4",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.12.0",
-    "sanitize-html": "^2.8.1",
+    "sanitize-html": "^2.10.0",
     "sharp": "^0.31.3",
-    "simple-git": "^3.16.0",
+    "simple-git": "^3.17.0",
     "svgo": "^3.0.2",
     "vue": "^2.7.1",
     "vue-prism-component": "^1.2.0",
-    "xml-formatter": "^3.2.0"
+    "xml-formatter": "^3.3.2"
   },
   "devDependencies": {
+    "dprint": "^0.35.1",
     "eslint": "^8.35.0",
-    "jest": "^29.5.0",
-    "libxmljs2": "^0.31.0"
+    "jest": "^29.5.0"
   },
   "jest": {
     "testEnvironment": "node",
@@ -79,8 +79,8 @@
     "transform": {}
   },
   "optionalDependencies": {
-    "@googlemaps/google-maps-services-js": "^3.3.26",
-    "chess.js": "^1.0.0-beta.1",
+    "@googlemaps/google-maps-services-js": "^3.3.27",
+    "chess.js": "^1.0.0-beta.3",
     "color": "^4.2.3",
     "gifencoder": "^2.0.1",
     "libxmljs2": "^0.31.0",

From cb5bc6c9b9080f4986641a8aa423703ba2571bc3 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Sun, 12 Mar 2023 23:56:30 -0400
Subject: [PATCH 085/196] chore: update dprint config

---
 .github/config/dprint.json | 4 +---
 .github/workflows/ci.yml   | 8 +++-----
 .github/workflows/test.yml | 6 +++---
 3 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/.github/config/dprint.json b/.github/config/dprint.json
index c52a129b74b..d5511d0d578 100644
--- a/.github/config/dprint.json
+++ b/.github/config/dprint.json
@@ -1,6 +1,4 @@
 {
-  "$schema": "https://dprint.dev/schemas/v0.json",
-  "projectType": "openSource",
   "incremental": true,
   "indentWidth": 2,
   "typescript": {
@@ -21,6 +19,6 @@
     ".github/scripts/quickstart/**/*"
   ],
   "plugins": [
-    "https://plugins.dprint.dev/typescript-0.68.0.wasm"
+    "https://plugins.dprint.dev/typescript-0.83.0.wasm"
   ]
 }
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index ecdb9d3a020..16e923e9523 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -23,15 +23,13 @@ jobs:
         uses: actions/checkout@v3
         with:
           fetch-depth: 0
-      - name: Setup Dprint
-        run: |
-          curl -fsSL https://dprint.dev/install.sh | sh
-          cp /home/runner/.dprint/bin/dprint /usr/local/bin/dprint
       - name: Checkout master
         run: git checkout master
       - name: Format code
         run: |
-          dprint fmt --config .github/config/dprint.json
+          npm install -g dprint
+          mkdir -v -p /home/runner/.cache/dprint/cache
+          npx dprint fmt --config .github/config/dprint.json
       - name: Publish formatted code
         run: |
           set +e
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index d73663ada4f..8de962921cb 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -39,9 +39,9 @@ jobs:
         uses: actions/checkout@v3
       - name: Format code with dprint
         run: |
-          curl -fsSL https://dprint.dev/install.sh | sh
-          cp /home/runner/.dprint/bin/dprint /usr/local/bin/dprint
-          dprint fmt --config .github/config/dprint.json
+          npm install -g dprint
+          mkdir -v -p /home/runner/.cache/dprint/cache
+          npx dprint fmt --config .github/config/dprint.json
       - name: Build lowlighter/metrics:${{ github.head_ref || 'master' }}
         run: docker build -t lowlighter/metrics:$(echo ${{ github.head_ref || 'master' }} | sed 's/\//-/g') .
       - name: Run tests

From 522b7e74b18c73e4d56a77ab72e50da3b65ec030 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Mar 2023 00:00:53 -0400
Subject: [PATCH 086/196] fix: add npx to dictionnary

---
 .github/actions/spelling/allow.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index bd6e6acc2df..24555fd1385 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -4,6 +4,7 @@ github
 githubassets
 https
 leetcode
+npx
 pgn
 scm
 shas

From 78709320de023ce98bb79e4572024d75512f698a Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Mon, 13 Mar 2023 04:39:48 +0000
Subject: [PATCH 087/196] chore: code formatting

---
 source/app/action/index.mjs                   |  5 +++--
 source/app/metrics/utils.mjs                  |  2 +-
 source/app/web/statics/insights/script.js     |  3 ++-
 source/plugins/anilist/index.mjs              |  6 ++++--
 source/plugins/base/index.mjs                 |  3 ++-
 source/plugins/community/nightscout/index.mjs |  6 +++---
 source/plugins/discussions/index.mjs          |  6 ++++--
 source/plugins/gists/index.mjs                |  3 ++-
 source/plugins/notable/index.mjs              |  9 ++++++---
 source/plugins/people/index.mjs               | 15 +++++++--------
 source/plugins/reactions/index.mjs            |  3 ++-
 source/plugins/sponsors/index.mjs             |  6 ++++--
 source/plugins/sponsorships/index.mjs         |  3 ++-
 source/plugins/stargazers/index.mjs           |  3 ++-
 source/plugins/starlists/index.mjs            |  4 ++--
 source/plugins/topics/index.mjs               |  2 +-
 16 files changed, 47 insertions(+), 32 deletions(-)

diff --git a/source/app/action/index.mjs b/source/app/action/index.mjs
index 10df0b73ec9..3b42c638b3d 100644
--- a/source/app/action/index.mjs
+++ b/source/app/action/index.mjs
@@ -455,7 +455,7 @@ function quit(reason) {
         info("Previous hash", previous)
         const current = await svg.hash(rendered)
         info("Current hash", current)
-        const changed = (previous !== current)
+        const changed = previous !== current
         info("Content changed", changed)
         if (!changed)
           committer.commit = false
@@ -632,7 +632,8 @@ function quit(reason) {
               info(`Branch ${committer.head}`, "(deleted)")
             }, {retries: retries_output_action, delay: retries_delay_output_action})
             break
-          } while (--attempts)
+          }
+          while (--attempts)
         }
       }
 
diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 74aa0441a10..3e111bfa8a3 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -524,7 +524,7 @@ export const svg = {
     const padding = {width: 1, height: 1, absolute: {width: 0, height: 0}}
     paddings = Array.isArray(paddings) ? paddings : `${paddings}`.split(",").map(x => x.trim())
     for (const [i, dimension] of [[0, "width"], [1, "height"]]) {
-      let operands = (paddings?.[i] ?? paddings[0])
+      let operands = paddings?.[i] ?? paddings[0]
       let {relative} = operands.match(/(?<relative>[+-]?[\d.]+)%$/)?.groups ?? {}
       operands = operands.replace(relative, "").trim()
       let {absolute} = operands.match(/^(?<absolute>[+-]?[\d.]+)/)?.groups ?? {}
diff --git a/source/app/web/statics/insights/script.js b/source/app/web/statics/insights/script.js
index b909352a4e8..c389166d095 100644
--- a/source/app/web/statics/insights/script.js
+++ b/source/app/web/statics/insights/script.js
@@ -138,7 +138,8 @@
                   console.warn(`${plugin}: no data yet, retrying in ${interval} seconds`)
                   await new Promise(solve => setTimeout(solve, interval * 1000))
                 }
-              } while (--attempts)
+              }
+              while (--attempts)
               completed++
               this.progress = completed / (data.plugins.length + 1)
               this.loaded.push(plugin)
diff --git a/source/plugins/anilist/index.mjs b/source/plugins/anilist/index.mjs
index 5211493bbec..2b77d71e12d 100644
--- a/source/plugins/anilist/index.mjs
+++ b/source/plugins/anilist/index.mjs
@@ -74,7 +74,8 @@ export default async function({login, data, queries, imports, q, account}, {enab
             if (await retry({login, imports, error}))
               continue
           }
-        } while (next)
+        }
+        while (next)
         //Format and save results
         result.lists[type].favorites = shuffle ? imports.shuffle(list) : list
         //Limit results
@@ -107,7 +108,8 @@ export default async function({login, data, queries, imports, q, account}, {enab
           if (await retry({login, imports, error}))
             continue
         }
-      } while (next)
+      }
+      while (next)
       //Format and save results
       result.characters = shuffle ? imports.shuffle(characters) : characters
       //Limit results
diff --git a/source/plugins/base/index.mjs b/source/plugins/base/index.mjs
index 83b1a9fe8a7..fcd6c6aca12 100644
--- a/source/plugins/base/index.mjs
+++ b/source/plugins/base/index.mjs
@@ -173,7 +173,8 @@ export default async function({login, graphql, rest, data, q, queries, imports,
             console.debug(`metrics/compute/${login}/base > retrieved less repositories than expected, probably no more to fetch`)
             break
           }
-        } while ((pushed) && (cursor) && ((data.user.repositories?.nodes?.length ?? 0) + (data.user.repositoriesContributedTo?.nodes?.length ?? 0) < repositories))
+        }
+        while ((pushed) && (cursor) && ((data.user.repositories?.nodes?.length ?? 0) + (data.user.repositoriesContributedTo?.nodes?.length ?? 0) < repositories))
         //Limit repositories
         console.debug(`metrics/compute/${login}/base > keeping only ${repositories} ${type}`)
         data.user[type].nodes.splice(repositories)
diff --git a/source/plugins/community/nightscout/index.mjs b/source/plugins/community/nightscout/index.mjs
index d04b7cfafac..abc283b0cf3 100644
--- a/source/plugins/community/nightscout/index.mjs
+++ b/source/plugins/community/nightscout/index.mjs
@@ -28,9 +28,9 @@ export default async function({q, imports, data, account}, {enabled = false, ext
       resp.data[i].arrowHumanReadable = directionArrow(resp.data[i].direction)
       resp.data[i].timeUTCHumanReadable = `${addZero(date.getUTCHours())}:${addZero(date.getUTCMinutes())}`
       /*
-           * Add colors and alert names
-           * TODO: Maybe make colors better themed instead of just the "github style" - red and yellow could fit better than darker shades of green
-           */
+       * Add colors and alert names
+       * TODO: Maybe make colors better themed instead of just the "github style" - red and yellow could fit better than darker shades of green
+       */
       let color = "#40c463"
       let alertName = "Normal"
       if (sgv >= urgenthighalert || sgv <= urgentlowalert) {
diff --git a/source/plugins/discussions/index.mjs b/source/plugins/discussions/index.mjs
index 7cc7d14fab2..24fec1ff754 100644
--- a/source/plugins/discussions/index.mjs
+++ b/source/plugins/discussions/index.mjs
@@ -28,7 +28,8 @@ export default async function({login, q, imports, graphql, queries, data, accoun
         fetched.push(...nodes)
         pushed = nodes.length
         console.debug(`metrics/compute/${login}/discussions > retrieved ${pushed} discussions after ${cursor}`)
-      } while ((pushed) && (cursor))
+      }
+      while ((pushed) && (cursor))
 
       //Compute upvotes
       fetched.map(({upvoteCount}) => discussions.upvotes.discussions += upvoteCount)
@@ -53,7 +54,8 @@ export default async function({login, q, imports, graphql, queries, data, accoun
         fetched.push(...nodes)
         pushed = nodes.length
         console.debug(`metrics/compute/${login}/discussions > retrieved ${pushed} comments after ${cursor}`)
-      } while ((pushed) && (cursor))
+      }
+      while ((pushed) && (cursor))
 
       //Compute upvotes
       fetched.map(({upvoteCount}) => discussions.upvotes.comments += upvoteCount)
diff --git a/source/plugins/gists/index.mjs b/source/plugins/gists/index.mjs
index 631667579c9..fb6109fb085 100644
--- a/source/plugins/gists/index.mjs
+++ b/source/plugins/gists/index.mjs
@@ -22,7 +22,8 @@ export default async function({login, data, graphql, q, imports, queries, accoun
         gists.push(...nodes)
         gists.totalCount = totalCount
         pushed = nodes.length
-      } while ((pushed) && (cursor))
+      }
+      while ((pushed) && (cursor))
       console.debug(`metrics/compute/${login}/plugins > gists > loaded ${gists.length} gists`)
     }
 
diff --git a/source/plugins/notable/index.mjs b/source/plugins/notable/index.mjs
index 57fce2f7241..c9adc3b7d0f 100644
--- a/source/plugins/notable/index.mjs
+++ b/source/plugins/notable/index.mjs
@@ -25,7 +25,8 @@ export default async function({login, q, imports, rest, graphql, data, account,
           .filter(({node}) => imports.filters.github(filter, {name: node.nameWithOwner, user: node.owner.login, stars: node.stargazers.totalCount, watchers: node.watchers.totalCount, forks: node.forks.totalCount}))
           .map(({node}) => contributions.push({handle: node.nameWithOwner, stars: node.stargazers.totalCount, issues: node.issues.totalCount, pulls: node.pullRequests.totalCount, organization: node.isInOrganization, avatarUrl: node.owner.avatarUrl}))
         pushed = edges.length
-      } while ((pushed) && (cursor))
+      }
+      while ((pushed) && (cursor))
     }
 
     //Set contributions
@@ -47,7 +48,8 @@ export default async function({login, q, imports, rest, graphql, data, account,
           cursor = edges?.[edges?.length - 1]?.cursor
           edges.map(({node: {repository: {nameWithOwner: repository}}}) => issues[repository] = (issues[repositories] ?? 0) + 1)
           pushed = edges.length
-        } while ((pushed) && (cursor))
+        }
+        while ((pushed) && (cursor))
       }
 
       //Fetch pull requests
@@ -61,7 +63,8 @@ export default async function({login, q, imports, rest, graphql, data, account,
           cursor = edges?.[edges?.length - 1]?.cursor
           edges.map(({node: {repository: {nameWithOwner: repository}}}) => pulls[repository] = (pulls[repositories] ?? 0) + 1)
           pushed = edges.length
-        } while ((pushed) && (cursor))
+        }
+        while ((pushed) && (cursor))
       }
 
       //Fetch commits
diff --git a/source/plugins/people/index.mjs b/source/plugins/people/index.mjs
index 6385772d880..79920f9c6b3 100644
--- a/source/plugins/people/index.mjs
+++ b/source/plugins/people/index.mjs
@@ -52,17 +52,16 @@ export default async function({login, data, graphql, rest, q, queries, imports,
         let pushed = 0
         do {
           console.debug(`metrics/compute/${login}/plugins > people > retrieving ${type} after ${cursor}`)
-          const {[type]: {edges}} = (
-            type in context.sponsorships
-              ? (await graphql(queries.people.sponsors({login: context.owner ?? login, type, size, after: cursor ? `after: "${cursor}"` : "", target: context.sponsorships[type], account})))[account]
-              : context.mode === "repository"
-              ? (await graphql(queries.people.repository({login: context.owner, repository: context.repo, type, size, after: cursor ? `after: "${cursor}"` : "", account})))[account].repository
-              : (await graphql(queries.people({login, type, size, after: cursor ? `after: "${cursor}"` : "", account})))[account]
-          )
+          const {[type]: {edges}} = type in context.sponsorships
+            ? (await graphql(queries.people.sponsors({login: context.owner ?? login, type, size, after: cursor ? `after: "${cursor}"` : "", target: context.sponsorships[type], account})))[account]
+            : context.mode === "repository"
+            ? (await graphql(queries.people.repository({login: context.owner, repository: context.repo, type, size, after: cursor ? `after: "${cursor}"` : "", account})))[account].repository
+            : (await graphql(queries.people({login, type, size, after: cursor ? `after: "${cursor}"` : "", account})))[account]
           cursor = edges?.[edges?.length - 1]?.cursor
           result[type].push(...edges.map(({node}) => node[context.sponsorships[type]] ?? node))
           pushed = edges.length
-        } while ((pushed) && (cursor) && ((limit === 0) || (result[type].length <= (shuffle ? 10 * limit : limit))))
+        }
+        while ((pushed) && (cursor) && ((limit === 0) || (result[type].length <= (shuffle ? 10 * limit : limit))))
       }
       //Shuffle
       if (shuffle) {
diff --git a/source/plugins/reactions/index.mjs b/source/plugins/reactions/index.mjs
index 4c6d40d8e99..0995f277f3e 100644
--- a/source/plugins/reactions/index.mjs
+++ b/source/plugins/reactions/index.mjs
@@ -33,7 +33,8 @@ export default async function({login, q, imports, data, graphql, queries, accoun
             fetched.splice(limit)
             console.debug(`metrics/compute/${login}/plugins > reactions > keeping only ${fetched.length} ${type} comments`)
           }
-        } while ((cursor) && (pushed) && (fetched.length < limit))
+        }
+        while ((cursor) && (pushed) && (fetched.length < limit))
         comments.push(...fetched)
       }
       catch (error) {
diff --git a/source/plugins/sponsors/index.mjs b/source/plugins/sponsors/index.mjs
index b92a50b47bb..f9f758979b4 100644
--- a/source/plugins/sponsors/index.mjs
+++ b/source/plugins/sponsors/index.mjs
@@ -31,7 +31,8 @@ export default async function({login, q, imports, data, graphql, queries, accoun
         fetched.push(...nodes)
         pushed = nodes.length
         console.debug(`metrics/compute/${login}/sponsors > retrieved ${pushed} sponsors after ${cursor}`)
-      } while ((pushed) && (cursor))
+      }
+      while ((pushed) && (cursor))
       list.push(...fetched.map(({privacyLevel: privacy, sponsorEntity: {login, avatarUrl, url: organization = null}, tier}) => ({login, avatarUrl, type: organization ? "organization" : "user", amount: tier?.monthlyPriceInDollars ?? null, past: false, private: privacy === "PRIVATE"})))
       await Promise.all(list.map(async user => user.avatar = await imports.imgb64(user.avatarUrl)))
       count.active.total = list.length
@@ -55,7 +56,8 @@ export default async function({login, q, imports, data, graphql, queries, accoun
           fetched.push(...nodes)
           pushed = nodes.length
           console.debug(`metrics/compute/${login}/sponsors > retrieved ${pushed} sponsors events after ${cursor}`)
-        } while ((pushed) && (cursor))
+        }
+        while ((pushed) && (cursor))
         users.push(...fetched.map(({sponsor: {login, avatarUrl, url: organization = null}, sponsorsTier}) => ({login, avatarUrl, type: organization ? "organization" : "user", amount: sponsorsTier?.monthlyPriceInDollars ?? null, past: true, private: false})))
       }
       for (const user of users) {
diff --git a/source/plugins/sponsorships/index.mjs b/source/plugins/sponsorships/index.mjs
index 26651aba879..d12826b0c0e 100644
--- a/source/plugins/sponsorships/index.mjs
+++ b/source/plugins/sponsorships/index.mjs
@@ -35,7 +35,8 @@ export default async function({login, q, imports, data, graphql, queries, accoun
           fetched.push(...nodes)
           pushed = nodes.length
           console.debug(`metrics/compute/${login}/sponsorships > retrieved ${pushed} sponsorships events after ${cursor}`)
-        } while ((pushed) && (cursor))
+        }
+        while ((pushed) && (cursor))
         list.push(...fetched.map(({sponsorable: {login, avatarUrl, url: organization = null}, tier: {name: tier}, privacyLevel: privacy, isActive: active}) => ({login, avatarUrl, type: organization ? "organization" : "user", tier, private: privacy !== "PUBLIC", past: !active})))
       }
       await Promise.all(list.map(async user => user.avatar = await imports.imgb64(user.avatarUrl)))
diff --git a/source/plugins/stargazers/index.mjs b/source/plugins/stargazers/index.mjs
index 5e035c3a452..2316e4fd353 100644
--- a/source/plugins/stargazers/index.mjs
+++ b/source/plugins/stargazers/index.mjs
@@ -27,7 +27,8 @@ export default async function({login, graphql, data, imports, q, queries, accoun
         if (_worldmap)
           locations.push(...edges.map(({node: {location}}) => location))
         pushed = edges.length
-      } while ((pushed) && (cursor))
+      }
+      while ((pushed) && (cursor))
       console.debug(`metrics/compute/${login}/plugins > stargazers > loaded ${dates.length} stargazers for ${repository}`)
     }
     console.debug(`metrics/compute/${login}/plugins > stargazers > loaded ${dates.length} stargazers in total`)
diff --git a/source/plugins/starlists/index.mjs b/source/plugins/starlists/index.mjs
index 54056b1bfbc..2ae74a21a4a 100644
--- a/source/plugins/starlists/index.mjs
+++ b/source/plugins/starlists/index.mjs
@@ -21,14 +21,14 @@ export default async function({login, q, imports, data, account}, {enabled = fal
     //Fetch star lists
     console.debug(`metrics/compute/${login}/plugins > starlists > fetching lists`)
     await page.goto(`https://github.com/${login}?tab=stars`)
-    let lists = (await page.evaluate(login =>
+    let lists = await page.evaluate(login =>
       [...document.querySelectorAll(`[href^='/stars/${login}/lists']`)].map(element => ({
         link: element.href,
         name: element.querySelector("h3")?.innerText ?? "",
         description: element.querySelector("span")?.innerText ?? "",
         count: Number(element.querySelector("div")?.innerText.match(/(?<count>\d+)/)?.groups.count),
         repositories: [],
-      })), login))
+      })), login)
     const count = lists.length
     console.debug(`metrics/compute/${login}/plugins > starlists > found [${lists.map(({name}) => name)}]`)
     lists = lists
diff --git a/source/plugins/topics/index.mjs b/source/plugins/topics/index.mjs
index 18661a9e5db..e6408354a61 100644
--- a/source/plugins/topics/index.mjs
+++ b/source/plugins/topics/index.mjs
@@ -9,7 +9,7 @@ export default async function({login, data, imports, q, account}, {enabled = fal
     //Load inputs
     let {sort, mode, limit} = imports.metadata.plugins.topics.inputs({data, account, q})
     const type = {starred: "labels", labels: "labels", mastered: "icons", icons: "icons"}[mode]
-    const shuffle = (sort === "random")
+    const shuffle = sort === "random"
 
     //Start puppeteer and navigate to topics
     console.debug(`metrics/compute/${login}/plugins > topics > searching starred topics`)

From e46761bf08a3f1d2c0fcdfede9a707e6e453ff53 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Mar 2023 19:09:34 -0400
Subject: [PATCH 088/196] chore: update package-lock.json

---
 package-lock.json | 322 ++++++++++++++++++++--------------------------
 1 file changed, 139 insertions(+), 183 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 134354811b3..898beb1c4ef 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -162,6 +162,15 @@
       "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
       "dev": true
     },
+    "node_modules/@babel/core/node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/@babel/generator": {
       "version": "7.21.1",
       "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz",
@@ -210,6 +219,15 @@
         "@babel/core": "^7.0.0"
       }
     },
+    "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/@babel/helper-environment-visitor": {
       "version": "7.18.9",
       "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
@@ -1384,18 +1402,6 @@
         "node-pre-gyp": "bin/node-pre-gyp"
       }
     },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "optional": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": {
       "version": "2.6.9",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
@@ -1416,21 +1422,6 @@
         }
       }
     },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-      "optional": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/@mapbox/node-pre-gyp/node_modules/tr46": {
       "version": "0.0.3",
       "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -1453,12 +1444,6 @@
         "webidl-conversions": "^3.0.0"
       }
     },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "optional": true
-    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -2848,54 +2833,20 @@
       ]
     },
     "node_modules/canvas": {
-      "version": "2.9.0",
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.0.tgz",
+      "integrity": "sha512-bdTjFexjKJEwtIo0oRx8eD4G2yWoUOXP9lj279jmQ2zMnTQhT8C3512OKz3s+ZOaQlLbE7TuVvRDYDB3Llyy5g==",
       "hasInstallScript": true,
-      "license": "MIT",
       "optional": true,
       "dependencies": {
         "@mapbox/node-pre-gyp": "^1.0.0",
-        "nan": "^2.15.0",
+        "nan": "^2.17.0",
         "simple-get": "^3.0.3"
       },
       "engines": {
         "node": ">=6"
       }
     },
-    "node_modules/canvas/node_modules/decompress-response": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
-      "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
-      "optional": true,
-      "dependencies": {
-        "mimic-response": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/canvas/node_modules/mimic-response": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
-      "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
-      "optional": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/canvas/node_modules/simple-get": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
-      "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
-      "optional": true,
-      "dependencies": {
-        "decompress-response": "^4.2.0",
-        "once": "^1.3.1",
-        "simple-concat": "^1.0.0"
-      }
-    },
     "node_modules/caseless": {
       "version": "0.12.0",
       "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
@@ -5787,6 +5738,15 @@
         "node": ">=8"
       }
     },
+    "node_modules/istanbul-lib-instrument/node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/istanbul-lib-report": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
@@ -6333,39 +6293,6 @@
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
-    "node_modules/jest-snapshot/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dev": true,
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-snapshot/node_modules/semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-      "dev": true,
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/jest-snapshot/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-      "dev": true
-    },
     "node_modules/jest-util": {
       "version": "29.5.0",
       "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
@@ -6764,6 +6691,15 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/make-dir/node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "devOptional": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/makeerror": {
       "version": "1.0.12",
       "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
@@ -7054,36 +6990,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/node-abi/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/node-abi/node_modules/semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/node-abi/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
     "node_modules/node-addon-api": {
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
@@ -7941,6 +7847,30 @@
         "node": ">=10"
       }
     },
+    "node_modules/prebuild-install/node_modules/simple-get": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "decompress-response": "^6.0.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
     "node_modules/prelude-ls": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -8741,14 +8671,35 @@
       "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
     },
     "node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "devOptional": true,
+      "version": "7.3.8",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
+      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
       "bin": {
         "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/semver/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
       }
     },
+    "node_modules/semver/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
     "node_modules/send": {
       "version": "0.18.0",
       "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
@@ -8843,36 +8794,30 @@
         "url": "https://opencollective.com/libvips"
       }
     },
-    "node_modules/sharp/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/sharp/node_modules/semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+    "node_modules/sharp/node_modules/simple-get": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
       "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
+        "decompress-response": "^6.0.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
       }
     },
-    "node_modules/sharp/node_modules/yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
-    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -8933,29 +8878,40 @@
       ]
     },
     "node_modules/simple-get": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
-      "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ],
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
+      "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
+      "optional": true,
       "dependencies": {
-        "decompress-response": "^6.0.0",
+        "decompress-response": "^4.2.0",
         "once": "^1.3.1",
         "simple-concat": "^1.0.0"
       }
     },
+    "node_modules/simple-get/node_modules/decompress-response": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+      "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+      "optional": true,
+      "dependencies": {
+        "mimic-response": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/simple-get/node_modules/mimic-response": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+      "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/simple-git": {
       "version": "3.17.0",
       "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.17.0.tgz",

From b85fa234dd18940ba2e541ddad0b43d4fba29851 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Mar 2023 19:37:00 -0400
Subject: [PATCH 089/196] feat(plugins/steam): add plugin (#1400) [skip ci]

---
 .github/actions/spelling/allow.txt            |   20 +
 .github/actions/spelling/excludes.txt         |    1 +
 .github/readme/imgs/plugin_steam_userid.png   |  Bin 0 -> 51943 bytes
 .github/readme/imgs/plugin_steam_webtoken.png |  Bin 0 -> 226573 bytes
 .../app/web/statics/embed/app.placeholder.js  |   98 +
 source/plugins/steam/README.md                |   22 +
 source/plugins/steam/examples.yml             |   31 +
 source/plugins/steam/index.mjs                |  104 +
 source/plugins/steam/metadata.yml             |   93 +
 source/templates/classic/partials/_.json      |    3 +-
 source/templates/classic/partials/steam.ejs   |  108 +
 source/templates/classic/style.css            |   82 +
 tests/mocks/api/axios/get/steam.mjs           | 2263 +++++++++++++++++
 tests/secrets.json                            |    1 +
 14 files changed, 2825 insertions(+), 1 deletion(-)
 create mode 100644 .github/readme/imgs/plugin_steam_userid.png
 create mode 100644 .github/readme/imgs/plugin_steam_webtoken.png
 create mode 100644 source/plugins/steam/README.md
 create mode 100644 source/plugins/steam/examples.yml
 create mode 100644 source/plugins/steam/index.mjs
 create mode 100644 source/plugins/steam/metadata.yml
 create mode 100644 source/templates/classic/partials/steam.ejs
 create mode 100644 tests/mocks/api/axios/get/steam.mjs

diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index 24555fd1385..dfdbd479d68 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -1,11 +1,23 @@
+appid
+apikey
+apiname
+appdetails
+appids
+appinfo
 deno
 gpgarmor
 github
 githubassets
 https
+IPlayer
+ISteam
 leetcode
+Nie
 npx
+personaname
 pgn
+playerstats
+rtime
 scm
 shas
 splatoon
@@ -13,5 +25,13 @@ Splatnet
 ssh
 statink
 STATINK
+steamcommunity
+steamid
+steamids
+steampowered
+timecreated
 ubuntu
+unlocktime
+userid
 yargsparser
+webtoken
diff --git a/.github/actions/spelling/excludes.txt b/.github/actions/spelling/excludes.txt
index 51b24af12b4..7b180c74c1a 100644
--- a/.github/actions/spelling/excludes.txt
+++ b/.github/actions/spelling/excludes.txt
@@ -55,3 +55,4 @@ ignore$
 ^\Qsource/templates/terminal/partials/screenshot.ejs\E$
 ^\Qtests/mocks/api/github/rest/emojis/get.mjs\E$
 ^\Qtests/mocks/api/axios/get/lichess.mjs\E$
+^\Qtests/mocks/api/axios/get/steam.mjs\E$
\ No newline at end of file
diff --git a/.github/readme/imgs/plugin_steam_userid.png b/.github/readme/imgs/plugin_steam_userid.png
new file mode 100644
index 0000000000000000000000000000000000000000..30ede9680f5207bda1d7a296f8050069440058b0
GIT binary patch
diff --git a/.github/readme/imgs/plugin_steam_webtoken.png b/.github/readme/imgs/plugin_steam_webtoken.png
new file mode 100644
index 0000000000000000000000000000000000000000..63e8371708414b98489b2edf60eb6e3cce9c1d6d
GIT binary patch
diff --git a/source/app/web/statics/embed/app.placeholder.js b/source/app/web/statics/embed/app.placeholder.js
index f671abaaeeb..da229afdc5f 100644
--- a/source/app/web/statics/embed/app.placeholder.js
+++ b/source/app/web/statics/embed/app.placeholder.js
@@ -1035,6 +1035,104 @@
             },
           })
           : null),
+        //Steam
+        ...(set.plugins.enabled.steam
+          ? ({
+            steam: {
+              sections: options["anilist.sections"].split(",").map(x => x.trim()).filter(x => x),
+              player: {
+                level: faker.datatype.number(100),
+                avatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
+                created: 1366386002,
+                name: faker.internet.userName(),
+              },
+              games: {
+                count: 2,
+                playtime: 89.23333333333333,
+                achievements: 0,
+                "most-played": [
+                  {
+                    id: 524220,
+                    name: "NieR:Automata™",
+                    icon:
+                      "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCABAAEADASIAAhEBAxEB/8QAHAAAAgMBAQEBAAAAAAAAAAAABgcFCAkEAwEA/8QAMBAAAQMDAwEGBQQDAAAAAAAAAQIDBAAFEQYHITESExQiQVEjMkJhcQhSobEVgcH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8ArPebk9cpIW+U8D0FcJUTj39q+Kxnjp6VN6N0zcdV3xi12lpTjzqgCoDIQPc0EKlZ6YJI6Yrvt1oudwIRAhPPqV+1NXb252F01pmHGfuDHjLoPMtazlGfbsmmoxZbXHwI9uhN4/aykH+qDNa5afvNsBE+3vsgj6k1EqKgeRhXTmtQXbTb3jh6BEcT7LZSo/yKXevNktKaqbkOGGIk5acNuMnsJSfwKCgXbUlWfqrpts12DLS8zgqB5yKJNydDXLQl9ct9xQe7J+G5jhQ9KEU/MMUH5XUZOR9qu1+l7Q8fS+jDfLk0lufLyVLWPlb6giqdaYgpueorfDI8rzoSRWhGpbZKe20MK15D6YiEoSnqSAKCMTuzZv8AMeFUy6Ifb7vx2fhAjqKYTD7chpDzCgttYCkqHQikM3fbEnbB6yqhpevThU34NKfi9vI82cUz9EKfs+lILd+eS24oAISRykY4BoC5RwCSQPzS9uu6tmgXZcRCHJEdo4elIPkb980R3iWLvZp8ayS21TO78uOopC27VtqsGjLzpm/2l1m8rU4UhxIKpBUrjBxQMHfPSkDX+3L8yEEPSmGy9GcQOSeOKoU60piQ404PM2opUPYjitDNl7XPg6Ebau6VBTqlLS2vqlB6CqQbsWtFn3AusZsdlJcLmPyTQRGkZibfqq2ynD5Wngo1ou5Pks6et8yE33iCyhS04z5SkVmecpWCnqORV7/0266Z1ZoliHJfQq5RPI40evYHAoCKdqvR0BwyViCLljPd9gBeag7rutF75pk2N98k+TBHP4rx3F2YiX68qvlqfVGuSQMIUSUEj7UAzdtNwo0pl+LLjPOtqzgNelAwY+58W3zA2rT8lhx35jkDipuJrLRV5mI8aICbik5Sh5sKXn84pSx9ttwrhOW7cJUdBUAAe66Ue6G2WhWq6ovF+f8AG3JGCgtkpQD9x60DMtEp+WHHFoCI2MN4GOKz73lnouW410eRyAstjHuCauzvNrGLonQ81/vEty3GyiMgcEqrPSXJXMmyJLxy68srJ+5OaDxX81EOhNWXHR1/YudsdUlTagVIB4UPYioi4wZEJ/upCCleM1yhJ59KC/8AtzvRpnV8NhLstuFcSACw6rlSvXFM5JT84UCFDg54rLZpx1hxLsdS2lJ6KScEf7ootm4OqbatCmLvJV2eneOFQ/ug0jzzyefzQDr3dfTOjWHRMnNPTUDiM2rzVR27bjaruR7Ui7SEk8ZbWU/9oXlyZEt0uS3nH3T9S1FR/mgLd0df3LXl9cmTVqEYKIaazwkenFBaeo9K+dk56V7w4zsqQGWkFS1dAKD/2Q==",
+                    playtime: 44.88333333333333,
+                    played: 1582407120,
+                    description: "NieR: Automata tells the story of androids 2B, 9S and A2 and their battle to reclaim the machine-driven dystopia overrun by powerful machines.",
+                    genres: [
+                      "Action",
+                      "RPG",
+                    ],
+                    achievements: [
+                      {
+                        icon:
+                          "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUGBwP/xAAmEAABAgQDCQAAAAAAAAAAAAABAAIDBAUGBxIUFiMxNVNhc5Gx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAME/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A6XVcM5QqlppTK+G4GJvSXEEngOyT7d1TpwPRRiVz5niH0qTWNVWbd1TpwPRTi1bhnK7UtNN5WQ2gRN0S0kg8D2Wdqsw158/xH6EBiVz5niH0qTWiXVb05XalqZTKyG0GHvQWkkHiOyT7CVTqQPZQSarMNefP8R+hGwlU6kD2U4tW3pyhVLUzeV8NwEPdAuIJPE9kH//Z",
+                        achieved: true,
+                        unlocked: 1565976624,
+                        name: "Transcendent Being",
+                        description: "",
+                        id: "ACH_BAD_END",
+                      },
+                      {
+                        icon:
+                          "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAABQQDAAL/xAAtEAABAwMCBAQGAwAAAAAAAAABAgMEAAURBiISITFBExQjMlFhcYGRsRXB0f/EABcBAQEBAQAAAAAAAAAAAAAAAAABAwT/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwC3UF7lWeeY8bc2rLnqKJIJPT6VhE1BdpCgAhtORy2qJ/ArxqprxtRIB7IH7pixMJZfZWOQPEB+DXG1FSL/AHhj3soB64IINU6evMm8TvLytqEYX6aikkg9D8vlSmomEPcK8hWEYIznuaE0uz4N/cx3R/dQdqdt3+cDkfgUtLZ2LOAr4DPaqbOiDeZrcW4w5cd2Mkq3HiQVBW4Ajl7eX3OOlb3W2yLjMMiPxJSklO9JByDjP0q+2tzIiAlyO27j4k1QfdotvsD7zjEOa9Hkoy64yBhrh6de2P1U2mXmpN2W8wh5Dakjh8UYKh3OKcuKZUpspbitNkjBOT/tHWu3yLfN8xJClpWQnYkqIyeX2oP/2Q==",
+                        achieved: true,
+                        unlocked: 1565976316,
+                        name: "A Round by the Pond",
+                        description: "20 different kinds of fish caught.",
+                        id: "ACH_FISHING",
+                      },
+                    ],
+                    rate: {
+                      total: 47,
+                      achieved: 47,
+                    },
+                  },
+                ],
+                "recently-played": [
+                  {
+                    id: 1113560,
+                    name: "NieR Replicant ver.1.22474487139...",
+                    icon:
+                      "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCABAAEADASIAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAABgcDBQEECAIA/8QAMBAAAQMDAgUCBgEFAQAAAAAAAQIDBAAFERIhBhMxQVEHYRQiIzJCcRUIJFJigcH/xAAYAQADAQEAAAAAAAAAAAAAAAABAgMABP/EAB8RAAICAwACAwAAAAAAAAAAAAABAhEDEiEEQSIxYf/aAAwDAQACEQMRAD8A6m228CgT1PmN/DtMDd1s6z+jRfebg3abVJnSN2mEa1fqubeKOOBxNcBYoTwTcpaylxfX6Z+0DwaWT9FsMbezNluY5e3Jdpt0hoMqRh94jIx4HvV9ZbVHs0NMa3r5YTuvmb6vcV9Bsjdkt6GorJ0gfMvuVd81aWpUfWEqBKldSqpHV+lhHZCmNTbqSfyFYdjoQgKdSS0fzHQVOuGIriXUk8rqfet55DcVkTYg5jB+9pW9YWynjKkR5BcjFL7H+o3o1tPEbbiEtyxy1dM0K3S2amhMthUjI1AZ2J8YrUtt6DTyBcGg2UnAKhso0U6BKCmi09dLkm3cEvLdUUtuZSrfqKQ/oPbbchM6+SAVzHCUoKznAB2xTj/qVZMn08faQkqdVnTjzQF6dQmWOD4fKQOcjdxI/VNJ0LiXxDNy5FlvXo5jRPzHskeTUciNFmR0vwZCQ71Tg7ZoUeW6J5nWtZkxSdDzIOdGKEo/FlxmcQqZiwHmilWFJ7Y84qd2X1G1br4/8O7BeSEuDrqGc/qpLZc+RJMaUfpObJBPehlm6KU+0uc1yXBsVEdRUvEENu5RNKlrQtr6jC0Kxk1vsDjQfEKjRgw25g5K0at+teNUG5RXTIbCHEjC09/2KHrRc0XaAwlSyHUfTO++1ef5Q2+4FqajY7ax0Ioi6tBd6o2r+QjxtassqUQR2G1IK4sXPh65MXC3zELjh0pcjAbhI710h6gsvOWlHJISkElRPakTxE6yxqclIPwh+Vah296M+MGDsFZZw1CU4LjDQYsh0AOxldFjyBWxHgMc9UlLaQ6vZeBUMN2JCjMhb6dKkhSD3welbLMqDJePwMlLjgGVpT2qTtnSlqZlRfiHmFLwW0KyoeR4qJUpLbHORlbTSjgf+VsPvKDiUspKlDqmhuXJ+HYfLSgVJJOj/I+KMX6Fkm+klhuTFr4mXHQomPJwUgncKO5ovvqorrzSJK0pc/An8vakxeHC1Li3SM5qTHXrUQe/cVf8cX1f8FAfOdThyhwHocU9E2unQ/EUkXO3PvNqKYUdOvmdnD4pK8ZRFOfGW6WOWmUyChRGwB3FP3iRtL1qctkZCUuSRpAA2T7mgj1UtammLNISxzQkhp9SR9oCetPJeyGGdcOd/TG4G7zXbBc1KE2EsqjLUdl74A99qawZgWNouTHWoh/LVjKjSC9WZbNt4nactWuNNbOoqScZHagGVcrlOK3JEyS7k5IU4SKDx7O0Os+q1as6Ru/FYkkpgILLWcKWo/cPY0u+LuNmYrzTMJfMcZOsqB2UT2pdyOILm+xyVu4RpCfl2OKqMkryrJPcmtHHTthyeTaqKDnh3idtiW9FkkqgSDqyo50LO5/5RFd7wzcOCp0DX/cxAXU7/iemKUmQVbZx4qQOuDOHFZIwd+o8GncVdkFmdas//9k=",
+                    playtime: 44.35,
+                    played: 1625611102,
+                    description: "The upgraded prequel of NieR:Automata. A kind young man sets out with Grimoire Weiss, a strange talking book, to search for the &quot;Sealed verses&quot; in order to save his sister Yonah, who fell terminally ill to the Black Scrawl.",
+                    genres: [
+                      "Action",
+                      "Adventure",
+                      "RPG",
+                    ],
+                    achievements: [
+                      {
+                        icon:
+                          "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAwUGBAL/xAAsEAACAgEDAwMDAwUAAAAAAAABAgMEBQAGERIhMSJBUQdhkRMUoRVDUnGz/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/xAAYEQEBAQEBAAAAAAAAAAAAAAABACERMf/aAAwDAQACEQMRAD8AsL+R3Jkd+5LEYnIrSr1Yo2QGFGDcqpJLEE88t4+2rbA08hXQDJ5N70jEDkxIgX/XSBzoWMxpr5vK3XPa08ZUD2CoF/PY6lZs7uaDaW9LmTr16NnHGT9nJGvVwvSCOxPq4DDhu3f21fcJ5a89nb8eKwVqKZ68mTtCoqxlAFLu3Qx6lbn0qPHzrNHlM5S3thcdcumercezDIpVCrGOIOGUhVIIblSD8ffSjIY3LZPZGzYzXS3LjpoLd4GRY1SJULBT1Hu3Qy/Y9/GqLH4dpc7jrP8ASWoVcfLI9UGRWLCVGMh4UkKvUV4HnudXCk+x+XisZ3IYz+9VCNz8hlB/jn+dSP1ZuGrs/dNeM8SW3pRIB5P6pCH/AJnXGWo7mxu/psvhKAvU7CKsimRF6V4UMOGYEN6fPfzphujZ1rPSLPDk7UD8wSiKZ+tVkicsvt7Bm4+CffUOCMYONyd/IboyG344QsVXJdVtyhCrVijjWNAf8pGX8Bu3fVVdz9SvuOhhnk5u3EeQIO5CgE8n8HSXBbZtbeny08Vy1dSy5siL9YiWWXjv1sex5+dI8Bh9yZL6hRbg3Jj4aaVYmihCOpBUhgPDE8+s8nto8Zt//9k=",
+                        achieved: true,
+                        unlocked: 1625610706,
+                        name: "e8 a8 98 e6 86 b6 e3 82 b5 e3 83 bc e3 83 90 e3 83 bc",
+                        description: "",
+                        id: "ACHIEVEMENT_0230",
+                      },
+                      {
+                        icon:
+                          "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAABgQFBwP/xAAsEAACAQQBAwIFBAMAAAAAAAABAgMEBQYRABIhMSJBBxMUUaEVIzJhUnGC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/8QAGhEAAwEBAQEAAAAAAAAAAAAAAAERIUExMv/aAAwDAQACEQMRAD8AXZJe7vT5DVJLe1sVvR1hgeeCN4JGIH8pvV0MdghXC/0TxvY6S4UsJ/Urm9fIwBBMSIF/10gb5Gp7LG9wvclZFHPTXAorQyKHR0EYUgg+ffgDNbZk2BWSeuw27O1hh0Xt9SonajUt5iZgT0bIBU9wD7+z9Yi8HGaV60ENKTkMVmknf5MRljV1lc6+4Ovbv4G+/CtFeMnt3xHtljvVfFU09XHI5VIkA0EYqdgAhtr48a4dseE5ZltTb8lya4W2qi6FqKairY2eKRWXYUqmgi999tkHR0eaHHZK2qyS23m809ujq6cMiCjeR+gFWB6mYAMNHQAUd/f244sDWW1vu8VRfbhbN/vUoRt/cMoP43+eTLxQpdLPX2+TulVTyQn/AKUgfnXM9yCgyy3ZrV3fG6GOtiqIgvTI6BV9KgjTMp36B3/vifFbvks88aX/AB40miCZ4qiNl2D/AIhiRzM6hp0+Gc/1Hw7xqQb39BErb9mUdJ/IPJtZfqSmyKgszODW1aNIqDyFAJ2fsPSeVCxX+wYvFQ2e3U1wrIzN8tvniNEBlZkBDaJPSwHkDY88O4xaMpuWd02QZVb4KN6WBoUETp0nYYDQDMd+o8YnWV4f/9k=",
+                        achieved: true,
+                        unlocked: 1625607419,
+                        name: "Daredevil",
+                        description: "",
+                        id: "ACHIEVEMENT_0460",
+                      },
+                    ],
+                    rate: {
+                      total: 47,
+                      achieved: 44,
+                    },
+                  },
+                ],
+              },
+            },
+          })
+          : null),
         //LeetCode
         ...(set.plugins.enabled.leetcode
           ? ({
diff --git a/source/plugins/steam/README.md b/source/plugins/steam/README.md
new file mode 100644
index 00000000000..8d720a2abab
--- /dev/null
+++ b/source/plugins/steam/README.md
@@ -0,0 +1,22 @@
+<!--header-->
+<!--/header-->
+
+## ➡️ Available options
+
+<!--options-->
+<!--/options-->
+
+## 🗝️ Obtaining a *Steam Web API* token
+
+Go to [steamcommunity.com/dev/apikey](https://steamcommunity.com/dev/apikey) to obtain a Steam Web API token:
+
+![Token](/.github/readme/imgs/plugin_steam_webtoken.png)
+
+To retrieve your Steam ID, access your user account on [store.steampowered.com/account](https://store.steampowered.com/account) and copy the identifier located behind the header:
+
+![User ID](/.github/readme/imgs/plugin_steam_userid.png)
+
+## ℹ️ Examples workflows
+
+<!--examples-->
+<!--/examples-->
diff --git a/source/plugins/steam/examples.yml b/source/plugins/steam/examples.yml
new file mode 100644
index 00000000000..8a125ba7ad6
--- /dev/null
+++ b/source/plugins/steam/examples.yml
@@ -0,0 +1,31 @@
+- name: Recently played games
+  uses: lowlighter/metrics@latest
+  with:
+    filename: metrics.plugin.steam.svg
+    token: NOT_NEEDED
+    base: ""
+    plugin_steam_token: ${{ secrets.STEAM_TOKEN }}
+    plugin_steam: yes
+    plugin_steam_user: 0
+    plugin_steam_sections: recently-played
+    plugin_steam_achievements_limit: 0
+  prod:
+    # ⚠️ Using mocked data for privacy reasons
+    with:
+      plugin_steam_token: MOCKED_TOKEN
+      use_mocked_data: yes
+
+- name: Profile and detailed game history
+  uses: lowlighter/metrics@latest
+  with:
+    filename: metrics.plugin.steam.full.svg
+    token: NOT_NEEDED
+    base: ""
+    plugin_steam_token: ${{ secrets.STEAM_TOKEN }}
+    plugin_steam: yes
+    plugin_steam_user: 0
+  prod:
+    # ⚠️ Using mocked data for privacy reasons
+    with:
+      plugin_steam_token: MOCKED_TOKEN
+      use_mocked_data: yes
\ No newline at end of file
diff --git a/source/plugins/steam/index.mjs b/source/plugins/steam/index.mjs
new file mode 100644
index 00000000000..209eeef2601
--- /dev/null
+++ b/source/plugins/steam/index.mjs
@@ -0,0 +1,104 @@
+//Setup
+export default async function({login, q, imports, data, account}, {token, enabled = false, extras = false} = {}) {
+  //Plugin execution
+  try {
+    //Check if plugin is enabled and requirements are met
+    if ((!q.steam) || (!imports.metadata.plugins.steam.enabled(enabled, {extras})))
+      return null
+
+    //Load inputs
+    let {user, sections, "games.ignored": _games_ignored, "games.limit": _games_limit, "recent.games.limit": _recent_games_limit, "achievements.limit": _achievements_limit, "playtime.threshold": _playtime_threshold} = imports.metadata.plugins.steam.inputs({data, account, q})
+
+    const urls = {
+      games: {
+        owned: `https://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=${token}&steamid=${user}&format=json&include_appinfo=1`,
+        schema: `https://api.steampowered.com/ISteamUserStats/GetSchemaForGame/v0002/?key=${token}&format=json`,
+        details: "https://store.steampowered.com/api/appdetails?",
+      },
+      player: {
+        summary: `https://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=${token}&steamids=${user}&format=json`,
+        level: `https://api.steampowered.com/IPlayerService/GetSteamLevel/v1/?key=${token}&steamid=${user}&format=json`,
+        achievement: `https://api.steampowered.com/ISteamUserStats/GetPlayerAchievements/v0001/?key=${token}&steamid=${user}&format=json&l=en`,
+      },
+    }
+    const result = {sections, player: null, games: {count: 0, playtime: 0, achievements: 0}}
+
+    //Fetch owned games
+    console.debug(`metrics/compute/${login}/plugins > steam > fetching owned games`)
+    let {data: {response: {game_count: count, games}}} = await imports.axios.get(urls.games.owned)
+    result.games.count = count
+    result.games.playtime = games.reduce((total, {playtime_forever: playtime}) => (total += playtime), 0) / 60
+
+    //Fetch game achievements and order games by section
+    for (const section of ["most-played", "recently-played"]) {
+      if (!sections.includes(section))
+        continue
+      result.games[section] = await Promise.all(
+        games
+          .map(({appid: id, name, img_icon_url: icon, playtime_forever: playtime, rtime_last_played: played}) => ({id, name, icon: `http://media.steampowered.com/steamcommunity/public/images/apps/${id}/${icon}.jpg`, playtime: playtime / 60, played}))
+          .filter(({playtime}) => (playtime >= _playtime_threshold))
+          .filter(({id}) => (!_games_ignored.includes(`${id}`)))
+          .sort((a, b) => ({"most-played": (b.playtime - a.playtime), "recently-played": (b.played - a.played)}[section]))
+          .slice(0, ({"most-played": _games_limit, "recently-played": _recent_games_limit}[section]) || Infinity)
+          .map(async game => {
+            const schema = {}
+            try {
+              console.debug(`metrics/compute/${login}/plugins > steam > fetching schema for "${game.name}" (${game.id})`)
+              const {data: {game: {availableGameStats: {achievements = []} = {}}}} = await imports.axios.get(`${urls.games.schema}&appid=${game.id}`)
+              Object.assign(schema, Object.fromEntries(achievements.map(({name, icon}) => [name, {icon}])))
+            }
+            catch (error) {
+              console.debug(`metrics/compute/${login}/plugins > steam > failed to get schema for "${game.name}" (${game.id}) > ${error}`)
+            }
+            const about = {}
+            try {
+              console.debug(`metrics/compute/${login}/plugins > steam > fetching details for "${game.name}" (${game.id})`)
+              const {data: {[game.id]: {data}}} = await imports.axios.get(`${urls.games.details}&appids=${game.id}`)
+              about.description = data.short_description ?? ""
+              about.genres = data.genres?.map(({description}) => description) ?? []
+            }
+            catch (error) {
+              console.debug(`metrics/compute/${login}/plugins > steam > failed to get details for "${game.name}" (${game.id}) > ${error}`)
+            }
+
+            let achievements = []
+            const rate = {total: Object.keys(schema).length, achieved: 0}
+            try {
+              console.debug(`metrics/compute/${login}/plugins > steam > fetching player achievements "${game.name}" (${game.id})`)
+              let {data: {playerstats: {achievements: list = []}}} = await imports.axios.get(`${urls.player.achievement}&appid=${game.id}`)
+              achievements = await Promise.all(list.map(async ({apiname: id, achieved, unlocktime: unlocked, name, description}) => ({icon: await imports.imgb64(schema[id]?.icon ?? null, {width: 32, height: 32}), achieved: !!achieved, unlocked, name, description, id})))
+              achievements = achievements.sort((a, b) => (b.unlocked - a.unlocked))
+              rate.achieved = achievements.filter(({achieved}) => achieved).length
+              achievements = achievements.slice(0, _achievements_limit)
+            }
+            catch (error) {
+              console.debug(`metrics/compute/${login}/plugins > steam > failed to get player achievements for "${game.name}" (${game.id}) > ${error}`)
+            }
+            return {...game, ...about, icon: await imports.imgb64(game.icon, {width: 64, height: 64}), achievements, rate}
+          }),
+      )
+    }
+
+    //Fetch player info
+    if (sections.includes("player")) {
+      console.debug(`metrics/compute/${login}/plugins > steam > fetching profile info`)
+      let {data: {response: {players: [info]}}} = await imports.axios.get(urls.player.summary)
+      console.debug(`metrics/compute/${login}/plugins > steam > fetching profile level`)
+      const {data: {response: {player_level: level}}} = await imports.axios.get(urls.player.level)
+      result.player = {
+        level,
+        avatar: await imports.imgb64(info.avatar, {width: 64, height: 64}),
+        created: info.timecreated,
+        name: info.personaname,
+      }
+    }
+
+    //Results
+    console.log(JSON.stringify(result))
+    return result
+  }
+  //Handle errors
+  catch (error) {
+    throw imports.format.error(error)
+  }
+}
diff --git a/source/plugins/steam/metadata.yml b/source/plugins/steam/metadata.yml
new file mode 100644
index 00000000000..d0b51951823
--- /dev/null
+++ b/source/plugins/steam/metadata.yml
@@ -0,0 +1,93 @@
+name: 🕹️ Steam
+category: social
+description: |
+  This plugin can display your player profile and played games from your Steam account.
+disclaimer: |
+  This plugin is not affiliated, associated, authorized, endorsed by, or in any way officially connected with [Steam](https://store.steampowered.com).
+  All product and company names are trademarks™ or registered® trademarks of their respective holders.
+examples:
+  +Recently played games: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.steam.svg
+  Profile and detailed game history: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.steam.full.svg
+supports:
+  - user
+  - organization
+scopes: []
+inputs:
+
+  plugin_steam:
+    description: |
+      Enable steam plugin
+    type: boolean
+    default: no
+
+  plugin_steam_token:
+    description: |
+      Steam token
+    type: token
+    default: ""
+    extras:
+      - metrics.api.steam
+
+  plugin_steam_sections:
+    description: |
+      Displayed sections
+
+      - `player`: display profile
+      - `most-played`: display most played games
+      - `recently-played`: display recently played games
+    type: array
+    format: comma-separated
+    default: player, most-played, recently-played
+    options:
+      - player
+      - most-played
+      - recently-played
+
+  plugin_steam_user:
+    description: |
+      Steam user id
+
+      This can be found on your Steam user account details
+    type: string
+    preset: no
+
+  plugin_steam_games_ignored:
+    description: |
+      Ignored games
+
+      Use App id as they are referenced in Steam catalog
+    type: array
+    format: comma-separated
+    default: ""
+    example: 400, 620 
+
+  plugin_steam_games_limit:
+    description: |
+      Display limit (Most played games)
+    type: number
+    min: 0
+    zero: disable
+    default: 1
+
+  plugin_steam_recent_games_limit:
+    description: |
+      Display limit (Recently played games)
+    type: number
+    min: 0
+    zero: disable
+    default: 1
+
+  plugin_steam_achievements_limit:
+    description: |
+      Display limit (Games achievements)
+    type: number
+    min: 0
+    default: 2
+
+  plugin_steam_playtime_threshold:
+    description: |
+      Display threshold (Game playtime in hours)
+    type: number
+    min: 0
+    default: 2
+
diff --git a/source/templates/classic/partials/_.json b/source/templates/classic/partials/_.json
index e8523ae520e..a7886e43ae6 100644
--- a/source/templates/classic/partials/_.json
+++ b/source/templates/classic/partials/_.json
@@ -42,5 +42,6 @@
   "sponsorships",
   "poopmap",
   "fortune",
-  "splatoon"
+  "splatoon",
+  "steam"
 ]
diff --git a/source/templates/classic/partials/steam.ejs b/source/templates/classic/partials/steam.ejs
new file mode 100644
index 00000000000..9d1345e3396
--- /dev/null
+++ b/source/templates/classic/partials/steam.ejs
@@ -0,0 +1,108 @@
+<% if (plugins.steam) { %>
+  <section class="steam">
+    <h2 class="field">
+      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M3.267 1.457c.3.286.312.76.026 1.06A6.475 6.475 0 001.5 7a6.472 6.472 0 001.793 4.483.75.75 0 01-1.086 1.034 8.89 8.89 0 01-.276-.304l.569-.49-.569.49A7.971 7.971 0 010 7c0-2.139.84-4.083 2.207-5.517a.75.75 0 011.06-.026zm9.466 0a.75.75 0 011.06.026A7.975 7.975 0 0116 7c0 2.139-.84 4.083-2.207 5.517a.75.75 0 11-1.086-1.034A6.475 6.475 0 0014.5 7a6.475 6.475 0 00-1.793-4.483.75.75 0 01.026-1.06zM8.75 8.582a1.75 1.75 0 10-1.5 0v5.668a.75.75 0 001.5 0V8.582zM5.331 4.736a.75.75 0 10-1.143-.972A4.983 4.983 0 003 7c0 1.227.443 2.352 1.177 3.222a.75.75 0 001.146-.967A3.483 3.483 0 014.5 7c0-.864.312-1.654.831-2.264zm6.492-.958a.75.75 0 00-1.146.967c.514.61.823 1.395.823 2.255 0 .86-.31 1.646-.823 2.255a.75.75 0 101.146.967A4.983 4.983 0 0013 7a4.983 4.983 0 00-1.177-3.222z"></path></svg>
+      Steam
+    </h2>
+    <% if (plugins.steam.error) { %>
+      <div class="row">
+        <section>
+          <div class="field error">
+            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M2.343 13.657A8 8 0 1113.657 2.343 8 8 0 012.343 13.657zM6.03 4.97a.75.75 0 00-1.06 1.06L6.94 8 4.97 9.97a.75.75 0 101.06 1.06L8 9.06l1.97 1.97a.75.75 0 101.06-1.06L9.06 8l1.97-1.97a.75.75 0 10-1.06-1.06L8 6.94 6.03 4.97z"></path></svg>
+            <%= plugins.steam.error.message %>
+          </div>
+        </section>
+      </div>
+    <% } else { %>
+      <% if ((plugins.steam.sections.includes("player"))&&(plugins.steam.player)) { %> 
+        <div class="row">
+          <section>
+            <div class="field">
+              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M10.561 8.073a6.005 6.005 0 0 1 3.432 5.142.75.75 0 1 1-1.498.07 4.5 4.5 0 0 0-8.99 0 .75.75 0 0 1-1.498-.07 6.004 6.004 0 0 1 3.431-5.142 3.999 3.999 0 1 1 5.123 0ZM10.5 5a2.5 2.5 0 1 0-5 0 2.5 2.5 0 0 0 5 0Z"></path></svg>
+              <%= plugins.steam.player.name %>
+            </div>
+            <div class="field">
+              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="m10.41.24 4.711 2.774c.544.316.878.897.879 1.526v5.01a1.77 1.77 0 0 1-.88 1.53l-7.753 4.521-.002.001a1.769 1.769 0 0 1-1.774 0H5.59L.873 12.85A1.761 1.761 0 0 1 0 11.327V6.292c0-.304.078-.598.22-.855l.004-.005.01-.019c.15-.262.369-.486.64-.643L8.641.239a1.752 1.752 0 0 1 1.765 0l.002.001ZM9.397 1.534l-7.17 4.182 4.116 2.388a.27.27 0 0 0 .269 0l7.152-4.148-4.115-2.422a.252.252 0 0 0-.252 0Zm-7.768 10.02 4.1 2.393V9.474a1.807 1.807 0 0 1-.138-.072L1.5 7.029v4.298c0 .095.05.181.129.227Zm8.6.642 1.521-.887v-4.45l-1.521.882ZM7.365 9.402h.001c-.044.026-.09.049-.136.071v4.472l1.5-.875V8.61Zm5.885 1.032 1.115-.65h.002a.267.267 0 0 0 .133-.232V5.264l-1.25.725Z"></path></svg>
+              <%= plugins.steam.games.count %> game<%= s(plugins.steam.games.count) %>
+            </div>
+          </section>
+          <section>
+            <div class="field">
+              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M8 .25a.75.75 0 0 1 .673.418l1.882 3.815 4.21.612a.75.75 0 0 1 .416 1.279l-3.046 2.97.719 4.192a.751.751 0 0 1-1.088.791L8 12.347l-3.766 1.98a.75.75 0 0 1-1.088-.79l.72-4.194L.818 6.374a.75.75 0 0 1 .416-1.28l4.21-.611L7.327.668A.75.75 0 0 1 8 .25Zm0 2.445L6.615 5.5a.75.75 0 0 1-.564.41l-3.097.45 2.24 2.184a.75.75 0 0 1 .216.664l-.528 3.084 2.769-1.456a.75.75 0 0 1 .698 0l2.77 1.456-.53-3.084a.75.75 0 0 1 .216-.664l2.24-2.183-3.096-.45a.75.75 0 0 1-.564-.41L8 2.694Z"></path></svg>
+              Steam level <%= plugins.steam.player.level %>
+            </div>
+            <div class="field">
+              <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="m.427 1.927 1.215 1.215a8.002 8.002 0 1 1-1.6 5.685.75.75 0 1 1 1.493-.154 6.5 6.5 0 1 0 1.18-4.458l1.358 1.358A.25.25 0 0 1 3.896 6H.25A.25.25 0 0 1 0 5.75V2.104a.25.25 0 0 1 .427-.177ZM7.75 4a.75.75 0 0 1 .75.75v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5A.75.75 0 0 1 7.75 4Z"></path></svg>
+              <%= f(parseInt(plugins.steam.games.playtime)) %> hour<%= s(plugins.steam.games.playtime) %> played
+            </div>
+          </section>
+        </div>
+      <% } %>
+      <% for (const section of ["most-played", "recently-played"]) { if (plugins.steam.sections.includes(section)) { %> 
+        <div class="games">
+          <h2 class="field">
+            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M2 4a1 1 0 100-2 1 1 0 000 2zm3.75-1.5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zM3 8a1 1 0 11-2 0 1 1 0 012 0zm-1 6a1 1 0 100-2 1 1 0 000 2z"></path></svg>
+            <%= {"most-played":"Most played", "recently-played":"Recently played"}[section] %>
+          </h2>
+          <div class="medias largeable-flex-wrap">
+            <% for (const {name, icon, playtime, played, achievements, rate, genres, description} of plugins.steam.games[section]) { %> 
+              <div class="media largeable-width-half">
+                <img src="<%= icon %>" alt="" />
+                <div class="about">
+                  <div class="name"><%= name %></div>
+                  <div class="infos">
+                    <div>
+                      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M2.5 7.775V2.75a.25.25 0 01.25-.25h5.025a.25.25 0 01.177.073l6.25 6.25a.25.25 0 010 .354l-5.025 5.025a.25.25 0 01-.354 0l-6.25-6.25a.25.25 0 01-.073-.177zm-1.5 0V2.75C1 1.784 1.784 1 2.75 1h5.025c.464 0 .91.184 1.238.513l6.25 6.25a1.75 1.75 0 010 2.474l-5.026 5.026a1.75 1.75 0 01-2.474 0l-6.25-6.25A1.75 1.75 0 011 7.775zM6 5a1 1 0 100 2 1 1 0 000-2z"></path></svg>
+                      <%= genres.join(", ") %>
+                    </div>
+                  </div>
+                  <div class="infos">
+                    <div>
+                      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M8 0a8 8 0 1 1 0 16A8 8 0 0 1 8 0ZM1.5 8a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm7-3.25v2.992l2.028.812a.75.75 0 0 1-.557 1.392l-2.5-1A.751.751 0 0 1 7 8.25v-3.5a.75.75 0 0 1 1.5 0Z"></path></svg>
+                      <%= f(parseInt(playtime)) %> hour<%= s(playtime) %> played
+                    </div>
+                  </div>
+                  <div class="infos">
+                    <div>
+                      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M4.75 0a.75.75 0 0 1 .75.75V2h5V.75a.75.75 0 0 1 1.5 0V2h1.25c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 13.25 16H2.75A1.75 1.75 0 0 1 1 14.25V3.75C1 2.784 1.784 2 2.75 2H4V.75A.75.75 0 0 1 4.75 0ZM2.5 7.5v6.75c0 .138.112.25.25.25h10.5a.25.25 0 0 0 .25-.25V7.5Zm10.75-4H2.75a.25.25 0 0 0-.25.25V6h11V3.75a.25.25 0 0 0-.25-.25Z"></path></svg>
+                      Last played on <%= f.date(played*1000, {date:true, timeZone:config.timezone?.name}) %>
+                    </div>
+                  </div>
+                  <div class="achievements">
+                    <div class="infos">
+                      <div>
+                        <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M3.217 6.962A3.75 3.75 0 0 1 0 3.25v-.5C0 1.784.784 1 1.75 1h1.356c.228-.585.796-1 1.462-1h6.864c.647 0 1.227.397 1.462 1h1.356c.966 0 1.75.784 1.75 1.75v.5a3.75 3.75 0 0 1-3.217 3.712 5.014 5.014 0 0 1-2.771 3.117l.144 1.446c.005.05.03.12.114.204.086.087.217.17.373.227.283.103.618.274.89.568.285.31.467.723.467 1.226v.75h1.25a.75.75 0 0 1 0 1.5H2.75a.75.75 0 0 1 0-1.5H4v-.75c0-.503.182-.916.468-1.226.27-.294.606-.465.889-.568.139-.048.266-.126.373-.227.084-.085.109-.153.114-.204l.144-1.446a5.015 5.015 0 0 1-2.77-3.117ZM4.5 1.568V5.5a3.5 3.5 0 1 0 7 0V1.568a.068.068 0 0 0-.068-.068H4.568a.068.068 0 0 0-.068.068Zm2.957 8.902-.12 1.204c-.093.925-.858 1.47-1.467 1.691a.766.766 0 0 0-.3.176c-.037.04-.07.093-.07.21v.75h5v-.75c0-.117-.033-.17-.07-.21a.766.766 0 0 0-.3-.176c-.609-.221-1.374-.766-1.466-1.69l-.12-1.204a5.064 5.064 0 0 1-1.087 0ZM13 2.5v2.872a2.25 2.25 0 0 0 1.5-2.122v-.5a.25.25 0 0 0-.25-.25H13Zm-10 0H1.75a.25.25 0 0 0-.25.25v.5c0 .98.626 1.813 1.5 2.122Z"></path></svg>
+                        <%= rate.achieved %> / <%= rate.total %> achievement<%= s(rate.total) %> unlocked
+                      </div>
+                    </div>
+                    <% { const achieved = achievements.filter(({achieved}) => achieved) %>
+                      <% for (const {icon, name, description, unlocked} of achieved) { %>
+                        <div class="achievement">
+                          <img src="<%= icon %>" alt="" />
+                          <div>
+                            <div class="name">
+                              <div><%= name %></div>
+                              <div class="unlocked"><%= f.date(unlocked*1000, {date:true, timeZone:config.timezone?.name}) %></div>
+                            </div>
+                            <div class="description"><%= description %></div>
+                          </div>
+                        </div> 
+                      <% } %>
+                      <% if ((achieved.length)&&(rate.achieved-achieved.length > 0)) { %> 
+                        <div class="achievement">
+                          <div>
+                            <div class="description ellipsis">+<%= rate.achieved-achieved.length %> other<%= s(rate.achieved-achieved.length) %>...</div>
+                          </div>
+                        </div> 
+                      <% } %>
+                    <% } %>
+                  </div>
+                </div>
+              </div>
+            <% } %>
+          </div>
+        </div>
+      <% } } %>
+    <% } %>
+  </section>
+<% } %>
diff --git a/source/templates/classic/style.css b/source/templates/classic/style.css
index a9abb963429..2215d1ed8b1 100644
--- a/source/templates/classic/style.css
+++ b/source/templates/classic/style.css
@@ -1049,6 +1049,88 @@
     border-radius: 7px;
   }
 
+/* Steam */
+  .steam .games {
+    margin-left: 28px;
+  }
+  .steam .media {
+    display: flex;
+    margin-bottom: 4px;
+    width: 450px;
+  }
+  .steam .media img {
+    margin: 0 10px;
+    border-radius: 7px;
+  }
+  .steam .media > img {
+    height: 32px;
+    width: 32px;
+  }
+  .steam .media .about {
+    flex-grow: 1;
+  }
+  .steam .media .name {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    font-size: 14px;
+    line-height: 14px;
+    color: #58a6ff;
+  }
+  .steam .media .infos {
+    font-size: 12px;
+    color: #666666;
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+  }
+  .steam .media .infos > div {
+    display: inline-flex;
+    align-items: center;
+    margin-right: 16px;
+  }
+  .steam .media .infos svg {
+    fill: currentColor;
+    height: 12px;
+    width: 12px;
+    margin: 0;
+    margin-right: 4px;
+  }
+  .steam .media .achievement img {
+    height: 22px;
+    width: 22px;
+    margin-right: 6px;
+  }
+  .steam .media .achievement .name {
+    display: flex;
+    justify-content: space-between;
+  }
+  .steam .media .achievement .name > div:first-child {
+    max-width: 280px;
+  }
+  .steam .media .achievement .description {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    display: block;
+    width: 344px;
+    max-height: 38px;
+    font-size: 12px;
+    white-space: normal;
+    /* May not work in all browsers */
+    display: -webkit-box;
+    -webkit-line-clamp: 2;
+    -webkit-box-orient: vertical;
+  }
+  .steam .media .achievement .unlocked {
+    font-size: 12px;
+    color: #666666;
+    font-style: italic;
+    flex-shrink: 0;
+  }
+  .steam .media .achievement .ellipsis {
+    margin-left: 18px;
+  }
+
 /* Licenses */
   .licenses {
     display: flex;
diff --git a/tests/mocks/api/axios/get/steam.mjs b/tests/mocks/api/axios/get/steam.mjs
new file mode 100644
index 00000000000..3ebb23e623f
--- /dev/null
+++ b/tests/mocks/api/axios/get/steam.mjs
@@ -0,0 +1,2263 @@
+/**Mocked data */
+export default function({faker, url, options, login = faker.internet.userName()}) {
+  // App details
+  if (/^https:..store.steampowered.com.api.appdetails*$/.test(url)) {
+    console.debug(`metrics/compute/mocks > mocking steam api result > ${url}`)
+    return ({
+      status: 200,
+      data: {
+        "524220": {
+          "success": true,
+          "data": {
+            "type": "game",
+            "name": "NieR:Automata™",
+            "steam_appid": 524220,
+            "required_age": 0,
+            "is_free": false,
+            "dlc": [
+              580600,
+            ],
+            "detailed_description":
+              '<h1>NieR:Automata™ Game of the YoRHa Edition<\/h1><p><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/extras\/Nier-GOTY-Steam-EN.jpg?t=1646911723" \/><br>The NieR:Automata™ Game of the YoRHa Edition includes the game itself and comes packed with DLC and bonus content for the full experience of the award-winning post-apocalyptic action RPG, including:<br><br><ul class="bb_ul"><li>3C3C1D119440927 DLC*<br><\/li><li>Valve Character Accessory<br><\/li><li>Cardboard Pod Skin<br><\/li><li>Retro Grey Pod Skin<br><\/li><li>Retro Red Pod Skin<br><\/li><li>Grimoire Weiss Pod<br><\/li><li>Machine Mask Accessory<br><\/li><li>Exclusive set of wallpapers in the following sizes: 1024 x 768, 1280 x 1024, 1920 x 1080, 2560 x 1600<\/li><\/ul><br>*To enjoy this content you will need to have progressed a certain way into the main story of the game. There are also some scenes during the progression of the main game scenario in which this content cannot be accessed.<\/p><br><h1>Featured DLC<\/h1><p><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/extras\/PromoBanner_616x389_en.png?t=1646911723" \/><br>The NieR: Automata 3C3C1D119440927 DLC is out now and includes three new colosseums to challenge, plus additional sub-quests. Upon completion of these quests, players can earn various rewards including new costumes from NieR: Replicant, new equipment and cosmetic accessories such as masks, hairspray that change the color of your character, records that add special music tracks to the players’ jukebox and much more!<\/p><br><h1>Reviews &amp; Accolades<\/h1><p>9\/10 <i>&quot;Don’t miss this&quot;<\/i> – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=https:\/\/www.videogamer.com\/reviews\/nier-automata-review" target="_blank" rel=" noopener"  >VideoGamer<\/a><br><br>10\/10 <i>&quot;One of the best games I’ve ever played&quot;<\/i> – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=http:\/\/www.rpgsite.net\/review\/5372-nier-automata-review" target="_blank" rel=" noopener"  >RPGSite<\/a><br><br>4\/5 <i>&quot;Pure genius&quot;<\/i> – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=http:\/\/www.trustedreviews.com\/nier-automata-review" target="_blank" rel=" noopener"  >Trusted Reviews<\/a><br><br>9\/10 <i>&quot;One of the most interesting and unique games you’ll play this year&quot;<\/i> – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=http:\/\/www.godisageek.com\/reviews\/nier-automata-review" target="_blank" rel=" noopener"  >God is a Geek<\/a><br><br>9\/10 <i>&quot;Classic Platinum action combined with a deep role-playing system&quot;<\/i> – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=http:\/\/metro.co.uk\/2017\/03\/06\/nier-automata-review-bullet-hell-meets-existential-role-player-6491251\/" target="_blank" rel=" noopener"  >Metro<\/a><\/p><br><h1>About the Game<\/h1><a href="https:\/\/store.steampowered.com\/app\/1113560\/NieR_Replicant_ver122474487139\/" target="_blank" rel=""  id="dynamiclink_0" >https:\/\/store.steampowered.com\/app\/1113560\/NieR_Replicant_ver122474487139\/<\/a><br><br><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/extras\/Nier_PRE_Launch-ENG_UK_Multi_06_Mod.jpg?t=1646911723" \/><br>NieR: Automata tells the story of androids 2B, 9S and A2 and their battle to reclaim the machine-driven dystopia overrun by powerful machines.<br><br>Humanity has been driven from the Earth by mechanical beings from another world. In a final effort to take back the planet, the human resistance sends a force of android soldiers to destroy the invaders. Now, a war between machines and androids rages on... A war that could soon unveil a long-forgotten truth of the world.<br><br>Key Features:<br><ul class="bb_ul"><li><strong>Action-Packed Battles<\/strong> – Players will switch between using melee and ranged attacks in battle against hordes of enemies and challenging bosses across a variety of open field maps. The tight controls and incredibly fluid combat are simple to learn for newcomers while offering plenty of depth for more experienced action gamers. Players can perform high-speed battle actions—combining light and heavy attacks—and switch through an arsenal of weaponry while evading enemies with speed and style. <br><\/li><li><strong>Beautifully Desolate Open-World<\/strong> – The game seamlessly joins together hauntingly beautiful vistas and locations with no area loading. The environments are rendered in 60fps and contain a wealth of sub-events in addition to the main storyline. <br><\/li><li><strong>Masterfully Crafted Story and Characters<\/strong> – NieR: Automata tells the story of androids 2B, 9S and A2 and their ferocious battle to reclaim a machine-driven dystopia overrun by powerful weapons known as machine lifeforms.<br><\/li><li><strong>Elements of an RPG<\/strong> – Players will obtain a variety of weapon types, level up in battle, learn new combat skills, and customise a loadout that caters to their playstyle.<br><\/li><li><strong>Utilise the Pod Support System to Assist In and Outside of Battle<\/strong> – Pods can attack the enemy in both manual and lock-on modes. They can also assist outside of battle, such as allowing the player to glide through the air. Pods can be enhanced throughout the game, with upgrades including new attack methods and variations.<br><\/li><li><strong>“Auto Mode” Available for Beginners <\/strong>– Novice players can elect “Auto Mode” for easy attacks and evasions.<\/li><\/ul>',
+            "about_the_game":
+              '<a href="https:\/\/store.steampowered.com\/app\/1113560\/NieR_Replicant_ver122474487139\/" target="_blank" rel=""  id="dynamiclink_1" >https:\/\/store.steampowered.com\/app\/1113560\/NieR_Replicant_ver122474487139\/<\/a><br><br><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/extras\/Nier_PRE_Launch-ENG_UK_Multi_06_Mod.jpg?t=1646911723" \/><br>NieR: Automata tells the story of androids 2B, 9S and A2 and their battle to reclaim the machine-driven dystopia overrun by powerful machines.<br><br>Humanity has been driven from the Earth by mechanical beings from another world. In a final effort to take back the planet, the human resistance sends a force of android soldiers to destroy the invaders. Now, a war between machines and androids rages on... A war that could soon unveil a long-forgotten truth of the world.<br><br>Key Features:<br><ul class="bb_ul"><li><strong>Action-Packed Battles<\/strong> – Players will switch between using melee and ranged attacks in battle against hordes of enemies and challenging bosses across a variety of open field maps. The tight controls and incredibly fluid combat are simple to learn for newcomers while offering plenty of depth for more experienced action gamers. Players can perform high-speed battle actions—combining light and heavy attacks—and switch through an arsenal of weaponry while evading enemies with speed and style. <br><\/li><li><strong>Beautifully Desolate Open-World<\/strong> – The game seamlessly joins together hauntingly beautiful vistas and locations with no area loading. The environments are rendered in 60fps and contain a wealth of sub-events in addition to the main storyline. <br><\/li><li><strong>Masterfully Crafted Story and Characters<\/strong> – NieR: Automata tells the story of androids 2B, 9S and A2 and their ferocious battle to reclaim a machine-driven dystopia overrun by powerful weapons known as machine lifeforms.<br><\/li><li><strong>Elements of an RPG<\/strong> – Players will obtain a variety of weapon types, level up in battle, learn new combat skills, and customise a loadout that caters to their playstyle.<br><\/li><li><strong>Utilise the Pod Support System to Assist In and Outside of Battle<\/strong> – Pods can attack the enemy in both manual and lock-on modes. They can also assist outside of battle, such as allowing the player to glide through the air. Pods can be enhanced throughout the game, with upgrades including new attack methods and variations.<br><\/li><li><strong>“Auto Mode” Available for Beginners <\/strong>– Novice players can elect “Auto Mode” for easy attacks and evasions.<\/li><\/ul>',
+            "short_description": "NieR: Automata tells the story of androids 2B, 9S and A2 and their battle to reclaim the machine-driven dystopia overrun by powerful machines.",
+            "supported_languages": "English<strong>*<\/strong>, French, Italian, German, Spanish - Spain, Japanese<strong>*<\/strong><br><strong>*<\/strong>languages with full audio support",
+            "reviews":
+              '“Riveting and gratifying combat”<br>9\/10 – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=http:\/\/www.gamespot.com\/reviews\/nier-automata-review\/1900-6416628\/" target="_blank" rel=" noopener"  >Gamespot<\/a><br><br>“A breath of fresh air”<br>4.5\/5 – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=http:\/\/www.gamesradar.com\/nier-automata-review\/" target="_blank" rel=" noopener"  >GamesRadar+<\/a><br><br>“Bold, ambitious, and surprising”<br>Recommended – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=http:\/\/www.eurogamer.net\/articles\/2017-02-27-nier-automata-review" target="_blank" rel=" noopener"  >Eurogamer<\/a><br>',
+            "header_image": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/header.jpg?t=1646911723",
+            "website": "http:\/\/www.niergame.com\/",
+            "pc_requirements": {
+              "minimum":
+                '<strong>Minimum:<\/strong><br><ul class="bb_ul"><li><strong>OS:<\/strong> Windows 7 \/8.1 \/10 64bit<br><\/li><li><strong>Processor:<\/strong> Intel Core i3 2100 or AMD A8-6500<br><\/li><li><strong>Memory:<\/strong> 4 GB RAM<br><\/li><li><strong>Graphics:<\/strong> NVIDIA GeForce GTX 770 VRAM 2GB or AMD Radeon R9 270X VRAM 2GB<br><\/li><li><strong>DirectX:<\/strong> Version 11<br><\/li><li><strong>Network:<\/strong> Broadband Internet connection<br><\/li><li><strong>Storage:<\/strong> 50 GB available space<br><\/li><li><strong>Sound Card:<\/strong> DirectX® 11 supported<br><\/li><li><strong>Additional Notes:<\/strong> Mouse, keyboard and game pad (XInput only). Screen resolution: 1280x720. This product only supports MS-IME keyboard input. There is a possibility that other IME will not function correctly with it.<\/li><\/ul>',
+              "recommended":
+                '<strong>Recommended:<\/strong><br><ul class="bb_ul"><li><strong>OS:<\/strong> Windows 8.1 \/10 64bit<br><\/li><li><strong>Processor:<\/strong> Intel Core i5 4670 or AMD A10-7850K<br><\/li><li><strong>Memory:<\/strong> 8 GB RAM<br><\/li><li><strong>Graphics:<\/strong> NVIDIA GeForce GTX 980 VRAM 4GB or AMD Radeon R9 380X VRAM 4GB<br><\/li><li><strong>DirectX:<\/strong> Version 11<br><\/li><li><strong>Network:<\/strong> Broadband Internet connection<br><\/li><li><strong>Storage:<\/strong> 50 GB available space<br><\/li><li><strong>Sound Card:<\/strong> DirectX® 11 supported<br><\/li><li><strong>Additional Notes:<\/strong> Mouse, keyboard and game pad (XInput only). Screen resolution: 1920x1080. Depending on the monitor and PC graphics card environment and setup used, this title can expand its display resolution to 4K. However, please be aware that 4K resolutions are not officially supported. This product only supports MS-IME keyboard input. There is a possibility that other IME will not function correctly with it.<\/li><\/ul>',
+            },
+            "mac_requirements": [],
+            "linux_requirements": [],
+            "legal_notice":
+              "© 2017 SQUARE ENIX CO., LTD. All Rights Reserved. Developed by PlatinumGames Inc. Character Design by Akihiko Yoshida. NieR: Automata is a registered trademark or trademark of Square Enix Co., Ltd. SQUARE ENIX and the SQUARE ENIX logo are registered trademarks or trademarks of Square Enix Holdings Co., Ltd. All other marks are properties of their respective owners.",
+            "developers": [
+              "Square Enix",
+              "PlatinumGames Inc.",
+            ],
+            "publishers": [
+              "Square Enix",
+            ],
+            "price_overview": {
+              "currency": "CAD",
+              "initial": 5350,
+              "final": 5350,
+              "discount_percent": 0,
+              "initial_formatted": "",
+              "final_formatted": "CDN$ 53.50",
+            },
+            "packages": [
+              339705,
+            ],
+            "package_groups": [
+              {
+                "name": "default",
+                "title": "Buy NieR:Automata™",
+                "description": "",
+                "selection_text": "Select a purchase option",
+                "save_text": "",
+                "display_type": 0,
+                "is_recurring_subscription": "false",
+                "subs": [
+                  {
+                    "packageid": 339705,
+                    "percent_savings_text": " ",
+                    "percent_savings": 0,
+                    "option_text": "NieR:Automata™ Game of the YoRHa Edition - CDN$ 53.50",
+                    "option_description": "",
+                    "can_get_free_license": "0",
+                    "is_free_license": false,
+                    "price_in_cents_with_discount": 5350,
+                  },
+                ],
+              },
+            ],
+            "platforms": {
+              "windows": true,
+              "mac": false,
+              "linux": false,
+            },
+            "metacritic": {
+              "score": 84,
+              "url": "https:\/\/www.metacritic.com\/game\/pc\/nier-automata?ftag=MCD-06-10aaa1f",
+            },
+            "categories": [
+              {
+                "id": 2,
+                "description": "Single-player",
+              },
+              {
+                "id": 22,
+                "description": "Steam Achievements",
+              },
+              {
+                "id": 29,
+                "description": "Steam Trading Cards",
+              },
+              {
+                "id": 18,
+                "description": "Partial Controller Support",
+              },
+              {
+                "id": 23,
+                "description": "Steam Cloud",
+              },
+              {
+                "id": 41,
+                "description": "Remote Play on Phone",
+              },
+              {
+                "id": 42,
+                "description": "Remote Play on Tablet",
+              },
+            ],
+            "genres": [
+              {
+                "id": "1",
+                "description": "Action",
+              },
+              {
+                "id": "3",
+                "description": "RPG",
+              },
+            ],
+            "screenshots": [
+              {
+                "id": 0,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_d0314b4c134329a483b5e43af951f60274abc66b.600x338.jpg?t=1646911723",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_d0314b4c134329a483b5e43af951f60274abc66b.1920x1080.jpg?t=1646911723",
+              },
+              {
+                "id": 1,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_8b29f7e1ce9a8b9313dc3eb50dbe76a4cf94eef9.600x338.jpg?t=1646911723",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_8b29f7e1ce9a8b9313dc3eb50dbe76a4cf94eef9.1920x1080.jpg?t=1646911723",
+              },
+              {
+                "id": 2,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_2c265df38c3d2d393d74ee8e74d79bdafa16b143.600x338.jpg?t=1646911723",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_2c265df38c3d2d393d74ee8e74d79bdafa16b143.1920x1080.jpg?t=1646911723",
+              },
+              {
+                "id": 3,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_831e0e7c9d514393b711e9ed1d6796042521a80c.600x338.jpg?t=1646911723",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_831e0e7c9d514393b711e9ed1d6796042521a80c.1920x1080.jpg?t=1646911723",
+              },
+              {
+                "id": 4,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_a6d164452c1aa00a0d7b7ca31aa76d787853b39e.600x338.jpg?t=1646911723",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_a6d164452c1aa00a0d7b7ca31aa76d787853b39e.1920x1080.jpg?t=1646911723",
+              },
+              {
+                "id": 5,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_edcb7633ff42d7200bcb240a1ebb1116d602d9fe.600x338.jpg?t=1646911723",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_edcb7633ff42d7200bcb240a1ebb1116d602d9fe.1920x1080.jpg?t=1646911723",
+              },
+              {
+                "id": 6,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_e926e3b5d440b4f244525745c7100edc2d717b85.600x338.jpg?t=1646911723",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_e926e3b5d440b4f244525745c7100edc2d717b85.1920x1080.jpg?t=1646911723",
+              },
+              {
+                "id": 7,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_02d2f3f2b7b7add8e6ad50d6b9325d05fa1d7bc7.600x338.jpg?t=1646911723",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_02d2f3f2b7b7add8e6ad50d6b9325d05fa1d7bc7.1920x1080.jpg?t=1646911723",
+              },
+              {
+                "id": 8,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_b55c67ac11781513183391c18ea86819e047577d.600x338.jpg?t=1646911723",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_b55c67ac11781513183391c18ea86819e047577d.1920x1080.jpg?t=1646911723",
+              },
+              {
+                "id": 9,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_c538e630c5cc224124104cc42ec6220ab90b5852.600x338.jpg?t=1646911723",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/ss_c538e630c5cc224124104cc42ec6220ab90b5852.1920x1080.jpg?t=1646911723",
+              },
+            ],
+            "movies": [
+              {
+                "id": 256744000,
+                "name": "ESRB EN Nier GOTY",
+                "thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256744000\/movie.293x165.jpg?t=1551200572",
+                "webm": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256744000\/movie480.webm?t=1551200572",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256744000\/movie_max.webm?t=1551200572",
+                },
+                "mp4": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256744000\/movie480.mp4?t=1551200572",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256744000\/movie_max.mp4?t=1551200572",
+                },
+                "highlight": true,
+              },
+              {
+                "id": 256681401,
+                "name": "Nier Pre-Launch ESRB EN",
+                "thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256681401\/movie.293x165.jpg?t=1489664283",
+                "webm": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256681401\/movie480.webm?t=1489664283",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256681401\/movie_max.webm?t=1489664283",
+                },
+                "mp4": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256681401\/movie480.mp4?t=1489664283",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256681401\/movie_max.mp4?t=1489664283",
+                },
+                "highlight": true,
+              },
+              {
+                "id": 256680536,
+                "name": "Nier Attract Trailer Unrated EN",
+                "thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256680536\/movie.293x165.jpg?t=1493741191",
+                "webm": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256680536\/movie480.webm?t=1493741191",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256680536\/movie_max.webm?t=1493741191",
+                },
+                "mp4": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256680536\/movie480.mp4?t=1493741191",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256680536\/movie_max.mp4?t=1493741191",
+                },
+                "highlight": true,
+              },
+            ],
+            "recommendations": {
+              "total": 80839,
+            },
+            "achievements": {
+              "total": 47,
+              "highlighted": [
+                {
+                  "name": "Resuscitated Body",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/524220\/3396a4732f6c521900195182eadc9c523988e271.jpg",
+                },
+                {
+                  "name": "Vestiges of Prosperity",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/524220\/a68518be86868a69b68d64b9720d65a33068713f.jpg",
+                },
+                {
+                  "name": "It's a Healthy Baby Boy!",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/524220\/9c038749e650134ddbe142a76c7a920e98947a82.jpg",
+                },
+                {
+                  "name": "We Await Your Next Visit",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/524220\/e028dca2f5773e58e6a36c0bbb5e3dfc4de1806a.jpg",
+                },
+                {
+                  "name": "Creation and Insurrection",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/524220\/52cadba291448ae488147c0a31e9ffddd64adab7.jpg",
+                },
+                {
+                  "name": "The Mechanical Kingdom",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/524220\/f57deb02acdf63c9cf9adc21abb5a3158db77cfa.jpg",
+                },
+                {
+                  "name": "Ruler of the Deep",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/524220\/6af7569b29b4f6f2b62f4a8d4b3be6f25183e8da.jpg",
+                },
+                {
+                  "name": "Those Who Love Humans",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/524220\/ef85393debcb1c87e0f48f50b8afd89305d65c73.jpg",
+                },
+                {
+                  "name": "Iron Soul",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/524220\/80808a96458c14f827bb66a12c1ef0a5c877b9d4.jpg",
+                },
+                {
+                  "name": "One Battle Ends",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/524220\/5172a623c717e83a83c41b52f52e9b39077f0289.jpg",
+                },
+              ],
+            },
+            "release_date": {
+              "coming_soon": false,
+              "date": "17 Mar, 2017",
+            },
+            "support_info": {
+              "url": "http:\/\/sqex.to\/steamsupport",
+              "email": "",
+            },
+            "background": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/page_bg_generated_v6b.jpg?t=1646911723",
+            "background_raw": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/524220\/page.bg.jpg?t=1646911723",
+            "content_descriptors": {
+              "ids": [],
+              "notes": null,
+            },
+          },
+        },
+        "1113560": {
+          "success": true,
+          "data": {
+            "type": "game",
+            "name": "NieR Replicant™ ver.1.22474487139...",
+            "steam_appid": 1113560,
+            "required_age": "17",
+            "is_free": false,
+            "dlc": [
+              1408390,
+            ],
+            "detailed_description":
+              '<h1>Reviews &amp; Accolades<\/h1><p><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/extras\/SNOW_Accolades_Banner_616x600_Steam_in-text_banner.jpg?t=1673963725" \/><\/p><br><h1>4 YoRHa<\/h1><p><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/extras\/SNOW_steamautomata_intextEN.jpg?t=1673963725" \/><br>4 YoRHa is a free downloadable content. <br>Enjoy 4 costumes and 4 weapons from NieR:Automata in NieR Replicant ver.1.22474487139....<br><br>*Due to the story of the game, this content may not be playable during some scenes.<br>*The full game (sold separately) is required to use this content. Also, if the latest patch needs to be applied, please update before use.<\/p><br><h1>About the Game<\/h1><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/extras\/Steam_Overview_Banner_new.png?t=1673963725" \/><br>A thousand-year lie that would live on for eternity...<br><br>NieR Replicant ver.1.22474487139... is an updated version of NieR Replicant, previously only released in Japan.<br><br>Discover the one-of-a-kind prequel to the critically-acclaimed masterpiece NieR:Automata. Now with a modern upgrade, experience masterfully revived visuals, a fascinating storyline and more! <br><br>The protagonist is a kind young man living in a remote village. In order to save his sister Yonah, who fell terminally ill to the Black Scrawl, he sets out with Grimoire Weiss, a strange talking tome, to search for the &quot;Sealed verses.&quot;<br><br>Experience the NieR Replicant story for the first time in the west through the eyes of the protagonist as a brother. <br><br>The original all-star team returns including acclaimed director, YOKO TARO (Drakengard \/ NieR:Automata), composer Keiichi Okabe (TEKKEN \/ Drakengard \/ NieR:Automata), and producer Yosuke Saito (DRAGON QUEST X \/ NieR:Automata).<br><br><br><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/extras\/Steam_Story_Banner_new.png?t=1673963725" \/><br>In a distant, distant future, humanity is on the brink of extinction.<br>A black scrawl disease and strange beasts threaten the world. <br>A young kindhearted boy makes a promise to his little sister.<br>A thousand-year lie that would live on for eternity...<br><br><br><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/extras\/Steam_Features_Banner_new.png?t=1673963725" \/><br><ul class="bb_ul"><li>Uncover the truth behind the world of NieR and prepare to question everything in this dark, twisting tale.<br><\/li><li>Journey alongside an unlikely group of allies through a ruined world, plagued by sickness and monstrous horrors.<br><\/li><li>A mesmerizing iconic soundtrack, newly recorded by NieR:Automata composer, Keiichi Okabe.<br><\/li><li>Fight back dreadful enemies with a visceral, uniquely customizable blend of swordplay and powerful magic.<br><\/li><li>Customize your character\'s magic, skills, and weapons with the power of Words.  <\/li><\/ul>',
+            "about_the_game":
+              '<img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/extras\/Steam_Overview_Banner_new.png?t=1673963725" \/><br>A thousand-year lie that would live on for eternity...<br><br>NieR Replicant ver.1.22474487139... is an updated version of NieR Replicant, previously only released in Japan.<br><br>Discover the one-of-a-kind prequel to the critically-acclaimed masterpiece NieR:Automata. Now with a modern upgrade, experience masterfully revived visuals, a fascinating storyline and more! <br><br>The protagonist is a kind young man living in a remote village. In order to save his sister Yonah, who fell terminally ill to the Black Scrawl, he sets out with Grimoire Weiss, a strange talking tome, to search for the &quot;Sealed verses.&quot;<br><br>Experience the NieR Replicant story for the first time in the west through the eyes of the protagonist as a brother. <br><br>The original all-star team returns including acclaimed director, YOKO TARO (Drakengard \/ NieR:Automata), composer Keiichi Okabe (TEKKEN \/ Drakengard \/ NieR:Automata), and producer Yosuke Saito (DRAGON QUEST X \/ NieR:Automata).<br><br><br><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/extras\/Steam_Story_Banner_new.png?t=1673963725" \/><br>In a distant, distant future, humanity is on the brink of extinction.<br>A black scrawl disease and strange beasts threaten the world. <br>A young kindhearted boy makes a promise to his little sister.<br>A thousand-year lie that would live on for eternity...<br><br><br><img src="https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/extras\/Steam_Features_Banner_new.png?t=1673963725" \/><br><ul class="bb_ul"><li>Uncover the truth behind the world of NieR and prepare to question everything in this dark, twisting tale.<br><\/li><li>Journey alongside an unlikely group of allies through a ruined world, plagued by sickness and monstrous horrors.<br><\/li><li>A mesmerizing iconic soundtrack, newly recorded by NieR:Automata composer, Keiichi Okabe.<br><\/li><li>Fight back dreadful enemies with a visceral, uniquely customizable blend of swordplay and powerful magic.<br><\/li><li>Customize your character\'s magic, skills, and weapons with the power of Words.  <\/li><\/ul>',
+            "short_description": "The upgraded prequel of NieR:Automata. A kind young man sets out with Grimoire Weiss, a strange talking book, to search for the &quot;Sealed verses&quot; in order to save his sister Yonah, who fell terminally ill to the Black Scrawl.",
+            "supported_languages": "English<strong>*<\/strong>, French, Italian, German, Spanish - Spain, Japanese<strong>*<\/strong>, Korean, Simplified Chinese, Traditional Chinese<br><strong>*<\/strong>languages with full audio support",
+            "reviews":
+              '“Lives up to the hype”<br>4.5\/5 – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=https:\/\/www.windowscentral.com\/nier-replicant-review" target="_blank" rel=" noopener"  >Windows Central<\/a><br><br>“Incredible, refined version”<br>5\/5 – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=https:\/\/www.thegamer.com\/nier-replicant-remake-review\/" target="_blank" rel=" noopener"  >https:\/\/www.thegamer.com\/nier-replicant-remake-review\/<\/a><br><br>“Ambitious, fascinating game”<br>10\/10 – <a href="https:\/\/steamcommunity.com\/linkfilter\/?url=https:\/\/www.gamingbible.co.uk\/reviews\/games-nier-replicant-ver122474487139-review-a-replayable-masterpiece-20210422?source=twitter" target="_blank" rel=" noopener"  >GAMINGbible<\/a><br>',
+            "header_image": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/header.jpg?t=1673963725",
+            "website": "https:\/\/nier.square-enix-games.com\/",
+            "pc_requirements": {
+              "minimum":
+                '<strong>Minimum:<\/strong><br><ul class="bb_ul"><li>Requires a 64-bit processor and operating system<br><\/li><li><strong>OS:<\/strong> Windows® 10 64-bit<br><\/li><li><strong>Processor:<\/strong> AMD Ryzen™ 3 1300X; Intel® Core™ i5-6400<br><\/li><li><strong>Memory:<\/strong> 8 GB RAM<br><\/li><li><strong>Graphics:<\/strong> AMD Radeon™ R9 270X; NVIDIA® GeForce® GTX 960<br><\/li><li><strong>DirectX:<\/strong> Version 11<br><\/li><li><strong>Storage:<\/strong> 26 GB available space<br><\/li><li><strong>Sound Card:<\/strong> DirectX Compatible Sound Card<br><\/li><li><strong>Additional Notes:<\/strong> 60 FPS @ 1280x720<\/li><\/ul>',
+              "recommended":
+                '<strong>Recommended:<\/strong><br><ul class="bb_ul"><li>Requires a 64-bit processor and operating system<br><\/li><li><strong>OS:<\/strong> Windows® 10 64-bit<br><\/li><li><strong>Processor:<\/strong> AMD Ryzen™ 3 1300X; Intel® Core™ i5-6400<br><\/li><li><strong>Memory:<\/strong> 16 GB RAM<br><\/li><li><strong>Graphics:<\/strong> AMD Radeon™ RX Vega 56; NVIDIA® GeForce® GTX 1660<br><\/li><li><strong>DirectX:<\/strong> Version 11<br><\/li><li><strong>Storage:<\/strong> 26 GB available space<br><\/li><li><strong>Sound Card:<\/strong> DirectX Compatible Sound Card<br><\/li><li><strong>Additional Notes:<\/strong> 60 FPS @ 1920x1080<\/li><\/ul>',
+            },
+            "mac_requirements": {
+              "minimum": '<strong>Minimum:<\/strong><br><ul class="bb_ul"><li>Requires a 64-bit processor and operating system<\/li><\/ul>',
+              "recommended": '<strong>Recommended:<\/strong><br><ul class="bb_ul"><li>Requires a 64-bit processor and operating system<\/li><\/ul>',
+            },
+            "linux_requirements": {
+              "minimum": '<strong>Minimum:<\/strong><br><ul class="bb_ul"><li>Requires a 64-bit processor and operating system<\/li><\/ul>',
+              "recommended": '<strong>Recommended:<\/strong><br><ul class="bb_ul"><li>Requires a 64-bit processor and operating system<\/li><\/ul>',
+            },
+            "legal_notice": "© 2010 SQUARE ENIX CO., LTD. All Rights Reserved. Developed by Toylogic Inc. <br \/>\r\nNIER REPLICANT is a registered trademark or trademark of Square Enix Co., Ltd. SQUARE ENIX and the SQUARE ENIX logo are registered trademarks or trademarks of Square Enix Holdings Co., Ltd.",
+            "developers": [
+              "Square Enix",
+              "Toylogic Inc.",
+            ],
+            "publishers": [
+              "Square Enix",
+            ],
+            "price_overview": {
+              "currency": "CAD",
+              "initial": 7999,
+              "final": 7999,
+              "discount_percent": 0,
+              "initial_formatted": "",
+              "final_formatted": "CDN$ 79.99",
+            },
+            "packages": [
+              502733,
+            ],
+            "package_groups": [
+              {
+                "name": "default",
+                "title": "Buy NieR Replicant™ ver.1.22474487139...",
+                "description": "",
+                "selection_text": "Select a purchase option",
+                "save_text": "",
+                "display_type": 0,
+                "is_recurring_subscription": "false",
+                "subs": [
+                  {
+                    "packageid": 502733,
+                    "percent_savings_text": " ",
+                    "percent_savings": 0,
+                    "option_text": "NieR Replicant ver.1.22474487139 - CDN$ 79.99",
+                    "option_description": "",
+                    "can_get_free_license": "0",
+                    "is_free_license": false,
+                    "price_in_cents_with_discount": 7999,
+                  },
+                ],
+              },
+            ],
+            "platforms": {
+              "windows": true,
+              "mac": false,
+              "linux": false,
+            },
+            "categories": [
+              {
+                "id": 2,
+                "description": "Single-player",
+              },
+              {
+                "id": 22,
+                "description": "Steam Achievements",
+              },
+              {
+                "id": 29,
+                "description": "Steam Trading Cards",
+              },
+              {
+                "id": 18,
+                "description": "Partial Controller Support",
+              },
+              {
+                "id": 23,
+                "description": "Steam Cloud",
+              },
+            ],
+            "genres": [
+              {
+                "id": "1",
+                "description": "Action",
+              },
+              {
+                "id": "25",
+                "description": "Adventure",
+              },
+              {
+                "id": "3",
+                "description": "RPG",
+              },
+            ],
+            "screenshots": [
+              {
+                "id": 0,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_2ff3ddb26c30b8397bce45abd0b4d847c3457259.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_2ff3ddb26c30b8397bce45abd0b4d847c3457259.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 1,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_f33bdbe53fa2d75e429f9b35a1299109c9ab8991.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_f33bdbe53fa2d75e429f9b35a1299109c9ab8991.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 2,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_b7867dae1f1fa62a2cc82165c8c79eb6821782d6.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_b7867dae1f1fa62a2cc82165c8c79eb6821782d6.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 3,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_8d7a5e5a0a7fe7782bf238763a2e29f8f6419e84.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_8d7a5e5a0a7fe7782bf238763a2e29f8f6419e84.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 4,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_f7689ef6964eee2407d9e996bc73b380e3e7a56a.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_f7689ef6964eee2407d9e996bc73b380e3e7a56a.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 5,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_6740ec558094fafc86f0933264e50e796c21e9cf.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_6740ec558094fafc86f0933264e50e796c21e9cf.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 6,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_eb6b583db6d9b3051c131ba748c768b2d6226277.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_eb6b583db6d9b3051c131ba748c768b2d6226277.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 7,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_c93af51b782d72cf081d4e8451836ad1716f63be.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_c93af51b782d72cf081d4e8451836ad1716f63be.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 8,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_56ecf25d6d95441a23f5481f895771c2dcb9ac18.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_56ecf25d6d95441a23f5481f895771c2dcb9ac18.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 9,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_a2c004272402bf76b70ed13c920fbd3c85d43d94.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_a2c004272402bf76b70ed13c920fbd3c85d43d94.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 10,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_0621ab7f10a0b23f4124509a13a8ace0487d856a.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_0621ab7f10a0b23f4124509a13a8ace0487d856a.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 11,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_ada29940be1bdb0e8b70e64788044f4c2592657f.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_ada29940be1bdb0e8b70e64788044f4c2592657f.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 12,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_1c972f496956e106c3b9023c68ff309fd649407e.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_1c972f496956e106c3b9023c68ff309fd649407e.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 13,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_344cfa42952beb6d51540d43bdfcbeaa0949c9a7.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_344cfa42952beb6d51540d43bdfcbeaa0949c9a7.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 14,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_2a5576351e2f84518dec11a796fbff609f4e5b9f.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_2a5576351e2f84518dec11a796fbff609f4e5b9f.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 15,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_071609b98112f7621067dd5275ce0ead665f13f2.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_071609b98112f7621067dd5275ce0ead665f13f2.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 16,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_b3a1dfdbb9d4a47b6407de5c8b1dc75ddfcea931.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_b3a1dfdbb9d4a47b6407de5c8b1dc75ddfcea931.1920x1080.jpg?t=1673963725",
+              },
+              {
+                "id": 17,
+                "path_thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_942e62e6f1bf312148a7480f943babe2325a3714.600x338.jpg?t=1673963725",
+                "path_full": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/ss_942e62e6f1bf312148a7480f943babe2325a3714.1920x1080.jpg?t=1673963725",
+              },
+            ],
+            "movies": [
+              {
+                "id": 256831765,
+                "name": "ESRB EN Launch NierRep",
+                "thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831765\/movie.293x165.jpg?t=1619194859",
+                "webm": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831765\/movie480_vp9.webm?t=1619194859",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831765\/movie_max_vp9.webm?t=1619194859",
+                },
+                "mp4": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831765\/movie480.mp4?t=1619194859",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831765\/movie_max.mp4?t=1619194859",
+                },
+                "highlight": true,
+              },
+              {
+                "id": 256831398,
+                "name": "PEGI FR Gestalt NierRep",
+                "thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831398\/movie.293x165.jpg?t=1619194237",
+                "webm": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831398\/movie480_vp9.webm?t=1619194237",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831398\/movie_max_vp9.webm?t=1619194237",
+                },
+                "mp4": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831398\/movie480.mp4?t=1619194237",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831398\/movie_max.mp4?t=1619194237",
+                },
+                "highlight": true,
+              },
+              {
+                "id": 256831395,
+                "name": "ESRB EN Extra content NierRep",
+                "thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831395\/movie.293x165.jpg?t=1619194332",
+                "webm": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831395\/movie480_vp9.webm?t=1619194332",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831395\/movie_max_vp9.webm?t=1619194332",
+                },
+                "mp4": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831395\/movie480.mp4?t=1619194332",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256831395\/movie_max.mp4?t=1619194332",
+                },
+                "highlight": true,
+              },
+              {
+                "id": 256827494,
+                "name": "ESRB EN OpeningCinematic NierRep",
+                "thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256827494\/movie.293x165.jpg?t=1616752558",
+                "webm": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256827494\/movie480_vp9.webm?t=1616752558",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256827494\/movie_max_vp9.webm?t=1616752558",
+                },
+                "mp4": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256827494\/movie480.mp4?t=1616752558",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256827494\/movie_max.mp4?t=1616752558",
+                },
+                "highlight": true,
+              },
+              {
+                "id": 256813164,
+                "name": "ESRB EN TGA 2020 NierRep",
+                "thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256813164\/movie.293x165.jpg?t=1607687616",
+                "webm": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256813164\/movie480_vp9.webm?t=1607687616",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256813164\/movie_max_vp9.webm?t=1607687616",
+                },
+                "mp4": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256813164\/movie480.mp4?t=1607687616",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256813164\/movie_max.mp4?t=1607687616",
+                },
+                "highlight": true,
+              },
+              {
+                "id": 256802321,
+                "name": "ESRB EN TGS NierRep",
+                "thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256802321\/movie.293x165.jpg?t=1600963175",
+                "webm": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256802321\/movie480_vp9.webm?t=1600963175",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256802321\/movie_max_vp9.webm?t=1600963175",
+                },
+                "mp4": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256802321\/movie480.mp4?t=1600963175",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256802321\/movie_max.mp4?t=1600963175",
+                },
+                "highlight": true,
+              },
+              {
+                "id": 256782057,
+                "name": "ESRB EN - Teaser",
+                "thumbnail": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256782057\/movie.293x165.jpg?t=1600964179",
+                "webm": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256782057\/movie480_vp9.webm?t=1600964179",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256782057\/movie_max_vp9.webm?t=1600964179",
+                },
+                "mp4": {
+                  "480": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256782057\/movie480.mp4?t=1600964179",
+                  "max": "http:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/256782057\/movie_max.mp4?t=1600964179",
+                },
+                "highlight": true,
+              },
+            ],
+            "recommendations": {
+              "total": 15065,
+            },
+            "achievements": {
+              "total": 47,
+              "highlighted": [
+                {
+                  "name": "The Final Verse",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/1113560\/a9369e5eddeb1486ffd849aa3820607353ddbc23.jpg",
+                },
+                {
+                  "name": "The Book of Legend",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/1113560\/6d11bfa34275061352048988a9202c3194259851.jpg",
+                },
+                {
+                  "name": "The Wild Companion",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/1113560\/8ac7d0d717ccda449162f94f81054073e9679fc5.jpg",
+                },
+                {
+                  "name": "The Mellow Companion",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/1113560\/1981aa8fe7fb43d11720331503fa3c9028f0e18a.jpg",
+                },
+                {
+                  "name": "Release",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/1113560\/88d76547290c9c200536cbb1a48d255303010a5b.jpg",
+                },
+                {
+                  "name": "Gratitude",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/1113560\/d9b8fd4cc2e4fc270edf18b177729b07e8a32cc9.jpg",
+                },
+                {
+                  "name": "Key Collector",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/1113560\/6629579d96114c2a268898911634495f8235ce08.jpg",
+                },
+                {
+                  "name": "A World in Flux",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/1113560\/4b3b4bcf8267f93bb73600cc688323c2c910e0b5.jpg",
+                },
+                {
+                  "name": "Combo Fanatic",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/1113560\/d19d83d2254a60554435a1e1d99896e96bdf64d5.jpg",
+                },
+                {
+                  "name": "Combo Master",
+                  "path": "https:\/\/cdn.akamai.steamstatic.com\/steamcommunity\/public\/images\/apps\/1113560\/d62e08ce00fd14c0fb72acebdfb09c838803a102.jpg",
+                },
+              ],
+            },
+            "release_date": {
+              "coming_soon": false,
+              "date": "23 Apr, 2021",
+            },
+            "support_info": {
+              "url": "https:\/\/support.square-enix-games.com\/",
+              "email": "",
+            },
+            "background": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/page_bg_generated_v6b.jpg?t=1673963725",
+            "background_raw": "https:\/\/cdn.akamai.steamstatic.com\/steam\/apps\/1113560\/page.bg.jpg?t=1673963725",
+            "content_descriptors": {
+              "ids": [
+                2,
+                5,
+              ],
+              "notes": "NieR Replicant ver.1.22474487139… contains adult scenes and theme, strong language in certain areas of the game, including blood, violence, criminal acts and killing. ",
+            },
+          },
+        },
+      },
+    })
+  }
+
+  //Steam api
+  if (/^https:..api.steampowered.com.*$/.test(url)) {
+    //Owned games
+    if (/^.*IPlayerService.GetOwnedGames.v0001.*$/.test(url)) {
+      console.debug(`metrics/compute/mocks > mocking steam api result > ${url}`)
+      return ({
+        status: 200,
+        data: {
+          "response": {
+            "game_count": 2,
+            "games": [
+              {
+                "appid": 524220,
+                "name": "NieR:Automata™",
+                "playtime_forever": 2693,
+                "img_icon_url": "ec431ecb2a5178c5a01bb15550f112f93af029bb",
+                "has_community_visible_stats": true,
+                "playtime_windows_forever": 3,
+                "playtime_mac_forever": 0,
+                "playtime_linux_forever": 0,
+                "rtime_last_played": 1582407120,
+              },
+              {
+                "appid": 1113560,
+                "name": "NieR Replicant ver.1.22474487139...",
+                "playtime_forever": 2661,
+                "img_icon_url": "8ca16d03995179d1ba3a2263e03db170100c6382",
+                "has_community_visible_stats": true,
+                "playtime_windows_forever": 2661,
+                "playtime_mac_forever": 0,
+                "playtime_linux_forever": 0,
+                "rtime_last_played": 1625611102,
+                "content_descriptorids": [
+                  2,
+                  5,
+                ],
+              },
+            ],
+          },
+        },
+      })
+    }
+    //Game schema
+    if (/^.*ISteamUserStats.GetSchemaForGame.v0002.*$/.test(url)) {
+      console.debug(`metrics/compute/mocks > mocking steam api result > ${url}`)
+      return ({
+        status: 200,
+        data: /appid=524220/.test(url)
+          ? {
+            "game": {
+              "gameName": "TRAIN",
+              "gameVersion": "14",
+              "availableGameStats": {
+                "achievements": [
+                  {
+                    "name": "ACH_VISITED_BUNKER",
+                    "defaultvalue": 0,
+                    "displayName": "Resuscitated Body",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/3396a4732f6c521900195182eadc9c523988e271.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_VISITED_RUINS_CITY",
+                    "defaultvalue": 0,
+                    "displayName": "Vestiges of Prosperity",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/a68518be86868a69b68d64b9720d65a33068713f.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_DESERT_AREA",
+                    "defaultvalue": 0,
+                    "displayName": "It's a Healthy Baby Boy!",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/9c038749e650134ddbe142a76c7a920e98947a82.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_AMUSEMENT_PARK",
+                    "defaultvalue": 0,
+                    "displayName": "We Await Your Next Visit",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/e028dca2f5773e58e6a36c0bbb5e3dfc4de1806a.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_ALIEN_SHIP",
+                    "defaultvalue": 0,
+                    "displayName": "Creation and Insurrection",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/52cadba291448ae488147c0a31e9ffddd64adab7.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_CASTLE_FOREST",
+                    "defaultvalue": 0,
+                    "displayName": "The Mechanical Kingdom",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/f57deb02acdf63c9cf9adc21abb5a3158db77cfa.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_SUBMERGE_CITY",
+                    "defaultvalue": 0,
+                    "displayName": "Ruler of the Deep",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/6af7569b29b4f6f2b62f4a8d4b3be6f25183e8da.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_COPY_CITY",
+                    "defaultvalue": 0,
+                    "displayName": "Those Who Love Humans",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/ef85393debcb1c87e0f48f50b8afd89305d65c73.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_ROBOT_MT",
+                    "defaultvalue": 0,
+                    "displayName": "Iron Soul",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/80808a96458c14f827bb66a12c1ef0a5c877b9d4.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_A",
+                    "defaultvalue": 0,
+                    "displayName": "One Battle Ends",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5172a623c717e83a83c41b52f52e9b39077f0289.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_B",
+                    "defaultvalue": 0,
+                    "displayName": "A New Battle Begins",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/91df4ff96e60f0f0434afd1105c82a59dddb20a9.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_SEE_2B_DIE",
+                    "defaultvalue": 0,
+                    "displayName": "Final Wish",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/9337b450a269e175ac5c96606237f7b5cedf52e4.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_PLAY_A2_FIRST_TIME",
+                    "defaultvalue": 0,
+                    "displayName": "Treacherous Blade",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/f8bbe8253972c94d1692dcc3733e98f37c0fd92e.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_LAST_REQUEST_PASCAL",
+                    "defaultvalue": 0,
+                    "displayName": "Farewell, Pascal",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/392b60acb70e7d048edbd4de5cfb5bb39ccc524c.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_KILL_ROBOT_BROTHER",
+                    "defaultvalue": 0,
+                    "displayName": "Justice",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/c81d259248687088bc59cdb50a668434bbb1e246.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_DEVOLA_NOVEL_END",
+                    "defaultvalue": 0,
+                    "displayName": "Crime and Punishment",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/9eb6d496221f65495a09764d3ae1ec453f12208f.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_9S",
+                    "defaultvalue": 0,
+                    "displayName": "Leaving for the New World",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/f92c92e085c3d6edec542f25b3561d8eb810c5d7.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_A2",
+                    "defaultvalue": 0,
+                    "displayName": "Beautiful World",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/c36712e0b97b65ee1ecb027db8e3ff8798d3bb55.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_TRUE_END",
+                    "defaultvalue": 0,
+                    "displayName": "The Minds That Emerged",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/2989eb6c7f2918ecfc7c756e401a271c17157c74.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_RECOVERY_SELF_CORPSE",
+                    "defaultvalue": 0,
+                    "displayName": "The Circle of Death",
+                    "hidden": 0,
+                    "description": "Have your body collected.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/076ec7fa27bb95797b07da45c3b65af5c3a447a9.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_RECOVERY_CORPSE",
+                    "defaultvalue": 0,
+                    "displayName": "Cherish Our Resources",
+                    "hidden": 0,
+                    "description": "Have 100 bodies collected.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/1940860e6bd542954652853f5fbbe8bcd58fbac4.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_QUEST_FIRST_TIME",
+                    "defaultvalue": 0,
+                    "displayName": "First Errand",
+                    "hidden": 0,
+                    "description": "Complete your first quest.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/f31eb13d16a028fb3de23f5623955b8441e57c7c.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_MANY_QUEST",
+                    "defaultvalue": 0,
+                    "displayName": "The Mercenary",
+                    "hidden": 0,
+                    "description": "80% of all quests completed.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/bbdd00f461406cbf64726d753dac5f3abe066ef8.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_COLLECT_ARCHIVE",
+                    "defaultvalue": 0,
+                    "displayName": "Information Master",
+                    "hidden": 0,
+                    "description": "80% of all archives found.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/8d536964d4eabac2027adfc2705661fea25ede6b.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_COLLECT_EM_LIST",
+                    "defaultvalue": 0,
+                    "displayName": "Destruction is My Job",
+                    "hidden": 0,
+                    "description": "80% of all unit data unlocked.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/8048ddee99c03defd4562520d28bc4445938bda0.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_COLLECT_CHIP",
+                    "defaultvalue": 0,
+                    "displayName": "Chip Collector",
+                    "hidden": 0,
+                    "description": "80% of all plug-in chips collected.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/c8600b37d39a3d09ba4730a480d4ea5c87790a22.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_HAS_ALL_ACTIVE_SKILL",
+                    "defaultvalue": 0,
+                    "displayName": "Weapons Maniac",
+                    "hidden": 0,
+                    "description": "All Pod programs obtained.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/bd78a999e5b0eea50d60e7e1158a93a58d82a517.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_WEAPON_LV_MAX",
+                    "defaultvalue": 0,
+                    "displayName": "Tools of the Trade",
+                    "hidden": 0,
+                    "description": "Any weapon upgraded to the highest level.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/6bd93e150b03f8de3c857e3589a4e92eed0b03cc.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_WEAPON_LV_MAX_ALL",
+                    "defaultvalue": 0,
+                    "displayName": "Inorganic Blade",
+                    "hidden": 0,
+                    "description": "All weapons upgraded to the highest level.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/54bf4e0bef1e06348ccc291d1e87d49ce58e63db.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_POD_LV_MAX_ALL",
+                    "defaultvalue": 0,
+                    "displayName": "Supreme Support Weapons",
+                    "hidden": 0,
+                    "description": "All Pods upgraded to the highest level.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/254d29f9ddf775427dec4ea2e2456ee32100f0bc.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CLEAR_HACKING_9S",
+                    "defaultvalue": 0,
+                    "displayName": "Fighting's Not My Thing",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/aa7810edbe2376ebe0456f553bd3d33a139bd539.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_HACKING_KILL",
+                    "defaultvalue": 0,
+                    "displayName": "A Scanner's Power",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/a8077834157c6407d5855157d0a902f5415edf07.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_REMOTO_KILL",
+                    "defaultvalue": 0,
+                    "displayName": "Machines vs. Machines",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/ac4bc0d5ea71c94f14b5b6d18c7aee30804fff55.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_BERSERKER_KILL",
+                    "defaultvalue": 0,
+                    "displayName": "The Power of Hate",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/ca0c9026a53cc307519c09b43b198823bd4a28b5.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_SHOOTING",
+                    "defaultvalue": 0,
+                    "displayName": "Ruler of the Skies",
+                    "hidden": 0,
+                    "description": "255 enemies destroyed using a flight unit.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/ed342c90ae36c5655e9e5ff2bef89162a5af8f62.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_EXTRACTION",
+                    "defaultvalue": 0,
+                    "displayName": "Harvest King",
+                    "hidden": 0,
+                    "description": "Materials gathered at a hidden harvest point 10 times.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/7434e8cf28fa79d62acf02c37359155c42223bef.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_GET_ALL_POD",
+                    "defaultvalue": 0,
+                    "displayName": "Pod Hunter",
+                    "hidden": 0,
+                    "description": "All Pods found.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/1f40b92b07294e7c25ef3b1d19dfb14f452e662c.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_RICH_MAN",
+                    "defaultvalue": 0,
+                    "displayName": "Desire Without Emotion",
+                    "hidden": 0,
+                    "description": "At least 100,000 G in possession.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/e899966832c71f405fc33a0e0302212efc66ee5a.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_ANIMAL_RUN",
+                    "defaultvalue": 0,
+                    "displayName": "Animal Rider",
+                    "hidden": 0,
+                    "description": "Any animal ridden for 5 kilometers.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/6985b5f0ff4c7b03aa8e652015e548d72198c575.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_FISHING",
+                    "defaultvalue": 0,
+                    "displayName": "A Round by the Pond",
+                    "hidden": 0,
+                    "description": "20 different kinds of fish caught.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/08f09efe530ca0dc577b3808a7d7a94a936df655.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_NPC_KILL",
+                    "defaultvalue": 0,
+                    "displayName": "Wait! Don't Kill Me!",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/41b7f8c6625f9a566c625b49f1c6cc8314202aad.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_SKIRT_ESCAPE",
+                    "defaultvalue": 0,
+                    "displayName": "What Are You Doing?",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/bf5e3ee4db9b1cd77223e1f30657325fda93b9f2.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_PANTS",
+                    "defaultvalue": 0,
+                    "displayName": "Not That I Mind...",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/31aef58a56f5e92d65437f17718c3dd01c54cf56.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_EMILE_SHOP",
+                    "defaultvalue": 0,
+                    "displayName": "Come Take a Look!",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/99f6388ed11b885d386eb979a2a8736290a4a235.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_KILL_EM1010",
+                    "defaultvalue": 0,
+                    "displayName": "Naughty Children",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/6e29e9ce653df1b4f4e51778df371f40851e409c.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_BAD_END",
+                    "defaultvalue": 0,
+                    "displayName": "Transcendent Being",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5649159a9e23e6f490360e0de38dd65da1fa9fdb.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                  {
+                    "name": "ACH_CALL_AT_KAINES_ROOM",
+                    "defaultvalue": 0,
+                    "displayName": "Lunar Tear",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/6b6e361e2917f8996a39b977b8df7a8fc640729d.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/524220/5cad263135d7f42d3304918370f492b353aa46f3.jpg",
+                  },
+                ],
+              },
+            },
+          }
+          : {
+            "game": {
+              "gameName": "",
+              "gameVersion": "30",
+              "availableGameStats": {
+                "achievements": [
+                  {
+                    "name": "ACHIEVEMENT_0000",
+                    "defaultvalue": 0,
+                    "displayName": "The Final Verse",
+                    "hidden": 0,
+                    "description": "Congratulations! Thank you for playing!",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/a9369e5eddeb1486ffd849aa3820607353ddbc23.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0010",
+                    "defaultvalue": 0,
+                    "displayName": "The Book of Legend",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/6d11bfa34275061352048988a9202c3194259851.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0020",
+                    "defaultvalue": 0,
+                    "displayName": "The Wild Companion",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/8ac7d0d717ccda449162f94f81054073e9679fc5.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0030",
+                    "defaultvalue": 0,
+                    "displayName": "The Mellow Companion",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/1981aa8fe7fb43d11720331503fa3c9028f0e18a.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0040",
+                    "defaultvalue": 0,
+                    "displayName": "Release",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/88d76547290c9c200536cbb1a48d255303010a5b.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0050",
+                    "defaultvalue": 0,
+                    "displayName": "Gratitude",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/d9b8fd4cc2e4fc270edf18b177729b07e8a32cc9.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0060",
+                    "defaultvalue": 0,
+                    "displayName": "Key Collector",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/6629579d96114c2a268898911634495f8235ce08.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0070",
+                    "defaultvalue": 0,
+                    "displayName": "A World in Flux",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/4b3b4bcf8267f93bb73600cc688323c2c910e0b5.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0080",
+                    "defaultvalue": 0,
+                    "displayName": "Combo Fanatic",
+                    "hidden": 0,
+                    "description": "You pulled off a 50-hit combo.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/d19d83d2254a60554435a1e1d99896e96bdf64d5.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0090",
+                    "defaultvalue": 0,
+                    "displayName": "Combo Master",
+                    "hidden": 0,
+                    "description": "You pulled off a 100-hit combo.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/d62e08ce00fd14c0fb72acebdfb09c838803a102.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0100",
+                    "defaultvalue": 0,
+                    "displayName": "The Magic Man",
+                    "hidden": 0,
+                    "description": "You learned every type of magic.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/2d7124c94623283b25cd1889cc6599d23b8cab5c.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0110",
+                    "defaultvalue": 0,
+                    "displayName": "Wordsmith",
+                    "hidden": 0,
+                    "description": "You collected 50 percent of all words.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/8a8b550048c266f8132d1d6c36967f2dee42a0ec.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0120",
+                    "defaultvalue": 0,
+                    "displayName": "Weapons Collector",
+                    "hidden": 0,
+                    "description": "You found every weapon.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/36b528043b6af91f11116aeed684d950722f1d60.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0130",
+                    "defaultvalue": 0,
+                    "displayName": "Village Handyman",
+                    "hidden": 0,
+                    "description": "You completed 10 quests.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/93856660d44eccb4edc0ebbb9d63a5445e688528.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0140",
+                    "defaultvalue": 0,
+                    "displayName": "Jack of All Trades",
+                    "hidden": 0,
+                    "description": "You completed 20 quests.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/ca294c1039d08d7c72682ca2a8dd88bca4a48cf0.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0150",
+                    "defaultvalue": 0,
+                    "displayName": "Go-To Guy",
+                    "hidden": 0,
+                    "description": "You completed 30 quests.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/ca294c1039d08d7c72682ca2a8dd88bca4a48cf0.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0160",
+                    "defaultvalue": 0,
+                    "displayName": "Dear Diary",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/676d5f5e2cd45a24738dc6078031f14d56ed923e.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0170",
+                    "defaultvalue": 0,
+                    "displayName": "Man of Means",
+                    "hidden": 0,
+                    "description": "You accumulated 1,000,000 pieces of gold.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/d7fb76788b77cd73639cefd292567e596ecc912a.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0180",
+                    "defaultvalue": 0,
+                    "displayName": "Educated Warrior",
+                    "hidden": 0,
+                    "description": "You read all novel segments about your friends' pasts.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/d59ca2f03b4015bc9b6134d921262f8768f843f1.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0190",
+                    "defaultvalue": 0,
+                    "displayName": "Call Her Back",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/cfbbf964649924e25af995c47f9207e6bdb0e82a.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0200",
+                    "defaultvalue": 0,
+                    "displayName": "Lingering Memories",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/7f65bb588647210451d003101fb6ce7ca335fb92.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0210",
+                    "defaultvalue": 0,
+                    "displayName": "Thank You",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/acd8fa3e92c01655b9dfeb91ea13b7c997df3825.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0220",
+                    "defaultvalue": 0,
+                    "displayName": "Something Very Special",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/5bc97058ccbe271edd966ca6ee9d0f4aefc0307b.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0230",
+                    "defaultvalue": 0,
+                    "displayName": "e8 a8 98 e6 86 b6 e3 82 b5 e3 83 bc e3 83 90 e3 83 bc",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/d556f212037cb9645aa17c87c1a01a34ccacfaa5.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0240",
+                    "defaultvalue": 0,
+                    "displayName": "Legendary Gardener",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/636ac036eb45750ac6d125ea8d6936ed1130266d.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0250",
+                    "defaultvalue": 0,
+                    "displayName": "Fish of Legend",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/b5e054f5234a31c7bbc3b458c0f3ae5289069b81.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0260",
+                    "defaultvalue": 0,
+                    "displayName": "A Round by the Pond",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/c67e64eb2e069c0b115a5feea3cb02451df4f11a.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0270",
+                    "defaultvalue": 0,
+                    "displayName": "Material Hunter",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/c0d448fc0d573abb796053bf7f2b12eb0b6f4c32.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0280",
+                    "defaultvalue": 0,
+                    "displayName": "Upgrade Apprentice",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/369a20404467230c20b158f7a3dd77699be9effd.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0290",
+                    "defaultvalue": 0,
+                    "displayName": "Reform Specialist",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/3abb815e20d23a97e80b2a10742cc3afd38e53cc.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0300",
+                    "defaultvalue": 0,
+                    "displayName": "Forging Master",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/ef2b7d68560bcfb3d32347e8884a0b736be4750b.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0310",
+                    "defaultvalue": 0,
+                    "displayName": "All Aboared!",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/669fb049d3b0d0ac200125736144e4e274c7620e.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0320",
+                    "defaultvalue": 0,
+                    "displayName": "The Sheep Whisperer",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/3c40216c95eb8d9acdb90435760c921dc6bd3954.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0330",
+                    "defaultvalue": 0,
+                    "displayName": "Lightspeed Fighter",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/f61dd8bd207e6a897ca5fa0297dbfbab0ff51103.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0340",
+                    "defaultvalue": 0,
+                    "displayName": "King of the Lost Shrine",
+                    "hidden": 0,
+                    "description": "You defeated Gretel within three minutes and twenty seconds.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/70883d0681b1993aa430bbcd8f9d4241f637b3ce.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0350",
+                    "defaultvalue": 0,
+                    "displayName": "A True Friend",
+                    "hidden": 0,
+                    "description": "You stopped the berserk Kainé within one minute.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/0b7d266b6959f86fa40ce0108cda8d7c7df207f9.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0360",
+                    "defaultvalue": 0,
+                    "displayName": "Boss of the Junk Heap",
+                    "hidden": 0,
+                    "description": "You defeated P-33 within four and a half minutes.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/602644eaf05ce46aa16b2d58299210d68e114d92.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0370",
+                    "defaultvalue": 0,
+                    "displayName": "Scourge of The Aerie",
+                    "hidden": 0,
+                    "description": "You defeated Wendy within eight and a half minutes.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/0ef270a84980596473ae130aee58f8275ee15ef2.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0380",
+                    "defaultvalue": 0,
+                    "displayName": "Protector of Facade",
+                    "hidden": 0,
+                    "description": "You defeated Roc within three and a half minutes.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/d9e9a588af83858f08ad062bba1d2148e23fdcde.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0390",
+                    "defaultvalue": 0,
+                    "displayName": "The Little Mermaid",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/0c6faf92c5cdfb91223238bfd12a0829bd8b13a9.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0400",
+                    "defaultvalue": 0,
+                    "displayName": "Permission Granted",
+                    "hidden": 0,
+                    "description": "You drove off Devola and Popola within three minutes.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/52b749ff62320430f2440c7dff89898e9fae3473.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0410",
+                    "defaultvalue": 0,
+                    "displayName": "A Dirge for the Hero",
+                    "hidden": 0,
+                    "description": "You defeated Goose within two minutes.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/c33b07dfe29428d7caab6a1f7c6a13c49e539ceb.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0420",
+                    "defaultvalue": 0,
+                    "displayName": "Soul Crusher",
+                    "hidden": 0,
+                    "description": "You defeated Devola and Popola within three and a half minutes.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/f80e7782c38c6657bb6a39f9c8904219e1cb3d1a.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0430",
+                    "defaultvalue": 0,
+                    "displayName": "Book Burner",
+                    "hidden": 0,
+                    "description": "You defeated Grimoire Noir within one and a half minutes.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/f0c1804eee52d941045b24beb6353967ad522eb7.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0440",
+                    "defaultvalue": 0,
+                    "displayName": "The Once and Final King",
+                    "hidden": 0,
+                    "description": "You defeated the Shadowlord within four minutes and twenty seconds.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/9395b1e23f8ffecde59ac3d84d4c17844d9c13e9.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0450",
+                    "defaultvalue": 0,
+                    "displayName": "The Strongest Bond",
+                    "hidden": 0,
+                    "description": "You defeated the berserk Kainé within three and a half minutes.",
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/66a42f466f875af265a505380e0c9754c8d2c550.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/dccf83b1927eb511d794ec172eb2a8737aa5f317.jpg",
+                  },
+                  {
+                    "name": "ACHIEVEMENT_0460",
+                    "defaultvalue": 0,
+                    "displayName": "Daredevil",
+                    "hidden": 1,
+                    "icon": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/9c70d4e9d69a09bcda912fa4323bded42b9d183a.jpg",
+                    "icongray": "https://steamcdn-a.akamaihd.net/steamcommunity/public/images/apps/1113560/67f2dca4872e41dd6ce5b923edf54bf16d42ef53.jpg",
+                  },
+                ],
+              },
+            },
+          },
+      })
+    }
+
+    //Player level
+    if (/^.*IPlayerService.GetSteamLevel.v1.*$/.test(url)) {
+      console.debug(`metrics/compute/mocks > mocking steam api result > ${url}`)
+      return ({
+        status: 200,
+        data: {
+          response: {
+            player_level: faker.datatype.number(500),
+          },
+        },
+      })
+    }
+
+    //Player summary
+    if (/^.*ISteamUser.GetPlayerSummaries.v0002.*$/.test(url)) {
+      console.debug(`metrics/compute/mocks > mocking steam api result > ${url}`)
+      return ({
+        status: 200,
+        data: {
+          "response": {
+            "players": [
+              {
+                "steamid": "0",
+                "communityvisibilitystate": 3,
+                "profilestate": 1,
+                "personaname": faker.internet.userName(),
+                "commentpermission": 2,
+                "profileurl": "https://steamcommunity.com/id",
+                "avatar": null,
+                "avatarmedium": null,
+                "avatarfull": null,
+                "avatarhash": "562c4d8db58d44af73b0f5f46d2f1bb5a24e54b3",
+                "lastlogoff": 1676688802,
+                "personastate": 0,
+                "primaryclanid": "0",
+                "timecreated": 1366386002,
+                "personastateflags": 0,
+                "loccountrycode": "FR",
+              },
+            ],
+          },
+        },
+      })
+    }
+
+    //Player achievements
+    if (/^.*ISteamUserStats.GetPlayerAchievements.v0001.*$/.test(url)) {
+      console.debug(`metrics/compute/mocks > mocking steam api result > ${url}`)
+      return ({
+        status: 200,
+        data: /appid=524220/.test(url)
+          ? {
+            "playerstats": {
+              "steamID": "76561198089224516",
+              "gameName": "NieR:Automata™",
+              "achievements": [
+                {
+                  "apiname": "ACH_VISITED_BUNKER",
+                  "achieved": 1,
+                  "unlocktime": 1565069702,
+                  "name": "Resuscitated Body",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_VISITED_RUINS_CITY",
+                  "achieved": 1,
+                  "unlocktime": 1565376632,
+                  "name": "Vestiges of Prosperity",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_DESERT_AREA",
+                  "achieved": 1,
+                  "unlocktime": 1565974024,
+                  "name": "It's a Healthy Baby Boy!",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_AMUSEMENT_PARK",
+                  "achieved": 1,
+                  "unlocktime": 1565974917,
+                  "name": "We Await Your Next Visit",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_ALIEN_SHIP",
+                  "achieved": 1,
+                  "unlocktime": 1565431434,
+                  "name": "Creation and Insurrection",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_CASTLE_FOREST",
+                  "achieved": 1,
+                  "unlocktime": 1565433829,
+                  "name": "The Mechanical Kingdom",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_SUBMERGE_CITY",
+                  "achieved": 1,
+                  "unlocktime": 1565434679,
+                  "name": "Ruler of the Deep",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_COPY_CITY",
+                  "achieved": 1,
+                  "unlocktime": 1565441114,
+                  "name": "Those Who Love Humans",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_ROBOT_MT",
+                  "achieved": 1,
+                  "unlocktime": 1565444308,
+                  "name": "Iron Soul",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_A",
+                  "achieved": 1,
+                  "unlocktime": 1565447636,
+                  "name": "One Battle Ends",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_B",
+                  "achieved": 1,
+                  "unlocktime": 1565532631,
+                  "name": "A New Battle Begins",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_SEE_2B_DIE",
+                  "achieved": 1,
+                  "unlocktime": 1565537220,
+                  "name": "Final Wish",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_PLAY_A2_FIRST_TIME",
+                  "achieved": 1,
+                  "unlocktime": 1565537371,
+                  "name": "Treacherous Blade",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_LAST_REQUEST_PASCAL",
+                  "achieved": 1,
+                  "unlocktime": 1565548811,
+                  "name": "Farewell, Pascal",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_KILL_ROBOT_BROTHER",
+                  "achieved": 1,
+                  "unlocktime": 1565551466,
+                  "name": "Justice",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_DEVOLA_NOVEL_END",
+                  "achieved": 1,
+                  "unlocktime": 1565553188,
+                  "name": "Crime and Punishment",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_9S",
+                  "achieved": 1,
+                  "unlocktime": 1565558387,
+                  "name": "Leaving for the New World",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CLEAR_A2",
+                  "achieved": 1,
+                  "unlocktime": 1565556538,
+                  "name": "Beautiful World",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_TRUE_END",
+                  "achieved": 1,
+                  "unlocktime": 1565558387,
+                  "name": "The Minds That Emerged",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_RECOVERY_SELF_CORPSE",
+                  "achieved": 1,
+                  "unlocktime": 1565431434,
+                  "name": "The Circle of Death",
+                  "description": "Have your body collected.",
+                },
+                {
+                  "apiname": "ACH_RECOVERY_CORPSE",
+                  "achieved": 1,
+                  "unlocktime": 1565473831,
+                  "name": "Cherish Our Resources",
+                  "description": "Have 100 bodies collected.",
+                },
+                {
+                  "apiname": "ACH_CLEAR_QUEST_FIRST_TIME",
+                  "achieved": 1,
+                  "unlocktime": 1565378552,
+                  "name": "First Errand",
+                  "description": "Complete your first quest.",
+                },
+                {
+                  "apiname": "ACH_CLEAR_MANY_QUEST",
+                  "achieved": 1,
+                  "unlocktime": 1565543033,
+                  "name": "The Mercenary",
+                  "description": "80% of all quests completed.",
+                },
+                {
+                  "apiname": "ACH_COLLECT_ARCHIVE",
+                  "achieved": 1,
+                  "unlocktime": 1565897848,
+                  "name": "Information Master",
+                  "description": "80% of all archives found.",
+                },
+                {
+                  "apiname": "ACH_COLLECT_EM_LIST",
+                  "achieved": 1,
+                  "unlocktime": 1565551063,
+                  "name": "Destruction is My Job",
+                  "description": "80% of all unit data unlocked.",
+                },
+                {
+                  "apiname": "ACH_COLLECT_CHIP",
+                  "achieved": 1,
+                  "unlocktime": 1565470147,
+                  "name": "Chip Collector",
+                  "description": "80% of all plug-in chips collected.",
+                },
+                {
+                  "apiname": "ACH_HAS_ALL_ACTIVE_SKILL",
+                  "achieved": 1,
+                  "unlocktime": 1565901900,
+                  "name": "Weapons Maniac",
+                  "description": "All Pod programs obtained.",
+                },
+                {
+                  "apiname": "ACH_WEAPON_LV_MAX",
+                  "achieved": 1,
+                  "unlocktime": 1565520201,
+                  "name": "Tools of the Trade",
+                  "description": "Any weapon upgraded to the highest level.",
+                },
+                {
+                  "apiname": "ACH_WEAPON_LV_MAX_ALL",
+                  "achieved": 1,
+                  "unlocktime": 1565892897,
+                  "name": "Inorganic Blade",
+                  "description": "All weapons upgraded to the highest level.",
+                },
+                {
+                  "apiname": "ACH_POD_LV_MAX_ALL",
+                  "achieved": 1,
+                  "unlocktime": 1565892998,
+                  "name": "Supreme Support Weapons",
+                  "description": "All Pods upgraded to the highest level.",
+                },
+                {
+                  "apiname": "ACH_CLEAR_HACKING_9S",
+                  "achieved": 1,
+                  "unlocktime": 1565448443,
+                  "name": "Fighting's Not My Thing",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_HACKING_KILL",
+                  "achieved": 1,
+                  "unlocktime": 1565483879,
+                  "name": "A Scanner's Power",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_REMOTO_KILL",
+                  "achieved": 1,
+                  "unlocktime": 1565883806,
+                  "name": "Machines vs. Machines",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_BERSERKER_KILL",
+                  "achieved": 1,
+                  "unlocktime": 1565903370,
+                  "name": "The Power of Hate",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_SHOOTING",
+                  "achieved": 1,
+                  "unlocktime": 1565433829,
+                  "name": "Ruler of the Skies",
+                  "description": "255 enemies destroyed using a flight unit.",
+                },
+                {
+                  "apiname": "ACH_EXTRACTION",
+                  "achieved": 1,
+                  "unlocktime": 1565892563,
+                  "name": "Harvest King",
+                  "description": "Materials gathered at a hidden harvest point 10 times.",
+                },
+                {
+                  "apiname": "ACH_GET_ALL_POD",
+                  "achieved": 1,
+                  "unlocktime": 1565524165,
+                  "name": "Pod Hunter",
+                  "description": "All Pods found.",
+                },
+                {
+                  "apiname": "ACH_RICH_MAN",
+                  "achieved": 1,
+                  "unlocktime": 1565467456,
+                  "name": "Desire Without Emotion",
+                  "description": "At least 100,000 G in possession.",
+                },
+                {
+                  "apiname": "ACH_ANIMAL_RUN",
+                  "achieved": 1,
+                  "unlocktime": 1565522297,
+                  "name": "Animal Rider",
+                  "description": "Any animal ridden for 5 kilometers.",
+                },
+                {
+                  "apiname": "ACH_FISHING",
+                  "achieved": 1,
+                  "unlocktime": 1565976316,
+                  "name": "A Round by the Pond",
+                  "description": "20 different kinds of fish caught.",
+                },
+                {
+                  "apiname": "ACH_NPC_KILL",
+                  "achieved": 1,
+                  "unlocktime": 1565481959,
+                  "name": "Wait! Don't Kill Me!",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_SKIRT_ESCAPE",
+                  "achieved": 1,
+                  "unlocktime": 1565902246,
+                  "name": "What Are You Doing?",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_PANTS",
+                  "achieved": 1,
+                  "unlocktime": 1565903882,
+                  "name": "Not That I Mind...",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_EMILE_SHOP",
+                  "achieved": 1,
+                  "unlocktime": 1565435609,
+                  "name": "Come Take a Look!",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_KILL_EM1010",
+                  "achieved": 1,
+                  "unlocktime": 1565889756,
+                  "name": "Naughty Children",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_BAD_END",
+                  "achieved": 1,
+                  "unlocktime": 1565976624,
+                  "name": "Transcendent Being",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACH_CALL_AT_KAINES_ROOM",
+                  "achieved": 1,
+                  "unlocktime": 1565903768,
+                  "name": "Lunar Tear",
+                  "description": "",
+                },
+              ],
+              "success": true,
+            },
+          }
+          : {
+            "playerstats": {
+              "steamID": "76561198089224516",
+              "gameName": "NieR Replicant ver.1.22474487139...",
+              "achievements": [
+                {
+                  "apiname": "ACHIEVEMENT_0000",
+                  "achieved": 0,
+                  "unlocktime": 0,
+                  "name": "The Final Verse",
+                  "description": "Congratulations! Thank you for playing!",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0010",
+                  "achieved": 1,
+                  "unlocktime": 1623873057,
+                  "name": "The Book of Legend",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0020",
+                  "achieved": 1,
+                  "unlocktime": 1624294156,
+                  "name": "The Wild Companion",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0030",
+                  "achieved": 1,
+                  "unlocktime": 1624466800,
+                  "name": "The Mellow Companion",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0040",
+                  "achieved": 1,
+                  "unlocktime": 1624471033,
+                  "name": "Release",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0050",
+                  "achieved": 1,
+                  "unlocktime": 1625520706,
+                  "name": "Gratitude",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0060",
+                  "achieved": 1,
+                  "unlocktime": 1624486870,
+                  "name": "Key Collector",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0070",
+                  "achieved": 1,
+                  "unlocktime": 1624489046,
+                  "name": "A World in Flux",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0080",
+                  "achieved": 1,
+                  "unlocktime": 1624399122,
+                  "name": "Combo Fanatic",
+                  "description": "You pulled off a 50-hit combo.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0090",
+                  "achieved": 1,
+                  "unlocktime": 1624486870,
+                  "name": "Combo Master",
+                  "description": "You pulled off a 100-hit combo.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0100",
+                  "achieved": 1,
+                  "unlocktime": 1624397883,
+                  "name": "The Magic Man",
+                  "description": "You learned every type of magic.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0110",
+                  "achieved": 1,
+                  "unlocktime": 1625391608,
+                  "name": "Wordsmith",
+                  "description": "You collected 50 percent of all words.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0120",
+                  "achieved": 1,
+                  "unlocktime": 1625417752,
+                  "name": "Weapons Collector",
+                  "description": "You found every weapon.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0130",
+                  "achieved": 1,
+                  "unlocktime": 1624277733,
+                  "name": "Village Handyman",
+                  "description": "You completed 10 quests.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0140",
+                  "achieved": 1,
+                  "unlocktime": 1624305463,
+                  "name": "Jack of All Trades",
+                  "description": "You completed 20 quests.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0150",
+                  "achieved": 1,
+                  "unlocktime": 1624310689,
+                  "name": "Go-To Guy",
+                  "description": "You completed 30 quests.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0160",
+                  "achieved": 1,
+                  "unlocktime": 1625417752,
+                  "name": "Dear Diary",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0170",
+                  "achieved": 1,
+                  "unlocktime": 1625396749,
+                  "name": "Man of Means",
+                  "description": "You accumulated 1,000,000 pieces of gold.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0180",
+                  "achieved": 1,
+                  "unlocktime": 1625590899,
+                  "name": "Educated Warrior",
+                  "description": "You read all novel segments about your friends' pasts.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0190",
+                  "achieved": 1,
+                  "unlocktime": 1624489684,
+                  "name": "Call Her Back",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0200",
+                  "achieved": 1,
+                  "unlocktime": 1625437212,
+                  "name": "Lingering Memories",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0210",
+                  "achieved": 1,
+                  "unlocktime": 1625592439,
+                  "name": "Thank You",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0220",
+                  "achieved": 1,
+                  "unlocktime": 1625598751,
+                  "name": "Something Very Special",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0230",
+                  "achieved": 1,
+                  "unlocktime": 1625610706,
+                  "name": "e8 a8 98 e6 86 b6 e3 82 b5 e3 83 bc e3 83 90 e3 83 bc",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0240",
+                  "achieved": 1,
+                  "unlocktime": 1625515136,
+                  "name": "Legendary Gardener",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0250",
+                  "achieved": 1,
+                  "unlocktime": 1625399355,
+                  "name": "Fish of Legend",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0260",
+                  "achieved": 1,
+                  "unlocktime": 1625406465,
+                  "name": "A Round by the Pond",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0270",
+                  "achieved": 1,
+                  "unlocktime": 1624305463,
+                  "name": "Material Hunter",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0280",
+                  "achieved": 1,
+                  "unlocktime": 1625396391,
+                  "name": "Upgrade Apprentice",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0290",
+                  "achieved": 1,
+                  "unlocktime": 1625517105,
+                  "name": "Reform Specialist",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0300",
+                  "achieved": 1,
+                  "unlocktime": 1625517174,
+                  "name": "Forging Master",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0310",
+                  "achieved": 1,
+                  "unlocktime": 1625522791,
+                  "name": "All Aboared!",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0320",
+                  "achieved": 1,
+                  "unlocktime": 1625600972,
+                  "name": "The Sheep Whisperer",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0330",
+                  "achieved": 0,
+                  "unlocktime": 0,
+                  "name": "Lightspeed Fighter",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0340",
+                  "achieved": 1,
+                  "unlocktime": 1625516447,
+                  "name": "King of the Lost Shrine",
+                  "description": "You defeated Gretel within three minutes and twenty seconds.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0350",
+                  "achieved": 1,
+                  "unlocktime": 1625392124,
+                  "name": "A True Friend",
+                  "description": "You stopped the berserk Kainé within one minute.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0360",
+                  "achieved": 1,
+                  "unlocktime": 1625405608,
+                  "name": "Boss of the Junk Heap",
+                  "description": "You defeated P-33 within four and a half minutes.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0370",
+                  "achieved": 1,
+                  "unlocktime": 1625518485,
+                  "name": "Scourge of The Aerie",
+                  "description": "You defeated Wendy within eight and a half minutes.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0380",
+                  "achieved": 1,
+                  "unlocktime": 1625521457,
+                  "name": "Protector of Facade",
+                  "description": "You defeated Roc within three and a half minutes.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0390",
+                  "achieved": 0,
+                  "unlocktime": 0,
+                  "name": "The Little Mermaid",
+                  "description": "",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0400",
+                  "achieved": 1,
+                  "unlocktime": 1625589841,
+                  "name": "Permission Granted",
+                  "description": "You drove off Devola and Popola within three minutes.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0410",
+                  "achieved": 1,
+                  "unlocktime": 1625437212,
+                  "name": "A Dirge for the Hero",
+                  "description": "You defeated Goose within two minutes.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0420",
+                  "achieved": 1,
+                  "unlocktime": 1625595493,
+                  "name": "Soul Crusher",
+                  "description": "You defeated Devola and Popola within three and a half minutes.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0430",
+                  "achieved": 1,
+                  "unlocktime": 1625595593,
+                  "name": "Book Burner",
+                  "description": "You defeated Grimoire Noir within one and a half minutes.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0440",
+                  "achieved": 1,
+                  "unlocktime": 1625591368,
+                  "name": "The Once and Final King",
+                  "description": "You defeated the Shadowlord within four minutes and twenty seconds.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0450",
+                  "achieved": 1,
+                  "unlocktime": 1625596007,
+                  "name": "The Strongest Bond",
+                  "description": "You defeated the berserk Kainé within three and a half minutes.",
+                },
+                {
+                  "apiname": "ACHIEVEMENT_0460",
+                  "achieved": 1,
+                  "unlocktime": 1625607419,
+                  "name": "Daredevil",
+                  "description": "",
+                },
+              ],
+              "success": true,
+            },
+          },
+      })
+    }
+  }
+}
diff --git a/tests/secrets.json b/tests/secrets.json
index 97ffeb99ec6..809c6094b83 100644
--- a/tests/secrets.json
+++ b/tests/secrets.json
@@ -12,6 +12,7 @@
   "GOOGLE_MAP_TOKEN": "MOCKED_TOKEN",
   "STOCK_TOKEN":"MOCKED_TOKEN",
   "CHESS_TOKEN":"MOCKED_TOKEN",
+  "STEAM_TOKEN":"MOCKED_TOKEN",
   "SPLATOON_TOKEN":"{}",
   "SPLATOON_STATINK_TOKEN":"MOCKED_TOKEN",
   "POOPMAP_TOKEN":"MOCKED_TOKEN"

From 013b2cb39997726e4d3a917983c8ce26a43271b2 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Mar 2023 19:40:44 -0400
Subject: [PATCH 090/196] chore(plugins/community/splatoon): upgrade s3si to v2
 (#1401) [skip ci]

---
 .../plugins/community/splatoon/s3si/index.ts  | 733 ++++++++++--------
 source/plugins/community/splatoon/token.ts    |   5 +-
 2 files changed, 420 insertions(+), 318 deletions(-)

diff --git a/source/plugins/community/splatoon/s3si/index.ts b/source/plugins/community/splatoon/s3si/index.ts
index 203a64e1de7..f2b37097b65 100644
--- a/source/plugins/community/splatoon/s3si/index.ts
+++ b/source/plugins/community/splatoon/s3si/index.ts
@@ -12,9 +12,9 @@ class APIError extends Error {
     }
 }
 const AGENT_NAME = "s3si.ts";
-const S3SI_VERSION = "0.2.4";
-const NSOAPP_VERSION = "2.4.0";
-const WEB_VIEW_VERSION = "2.0.0-bd36a652";
+const S3SI_VERSION = "0.3.1";
+const NSOAPP_VERSION = "2.5.0";
+const WEB_VIEW_VERSION = "3.0.0-2857bc50";
 const S3SI_LINK = "https://github.com/spacemeowx2/s3si.ts";
 const USERAGENT = `${AGENT_NAME}/${S3SI_VERSION} (${S3SI_LINK})`;
 const DEFAULT_APP_USER_AGENT = "Mozilla/5.0 (Linux; Android 11; Pixel 5) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/94.0.4606.61 Mobile Safari/537.36";
@@ -29,7 +29,7 @@ const SPLATNET3_STATINK_MAP = {
         LOFT: "yagura",
         GOAL: "hoko",
         CLAM: "asari",
-        TRI_COLOR: "nawabari"
+        TRI_COLOR: "tricolor"
     },
     RESULT: {
         WIN: "win",
@@ -54,15 +54,6 @@ const SPLATNET3_STATINK_MAP = {
         7: "giant_tornado",
         8: "mudmouth_eruption"
     },
-    COOP_UNIFORM_MAP: {
-        1: "orange",
-        2: "green",
-        3: "yellow",
-        4: "pink",
-        5: "blue",
-        6: "black",
-        7: "white"
-    },
     COOP_SPECIAL_MAP: {
         "bd327d1b64372dedefd32adb28bea62a5b6152d93aada5d9fc4f669a1955d6d4": "nicedama",
         "463eedc60013608666b260c79ac8c352f9795c3d0cce074d3fbbdbd2c054a56d": "hopsonar",
@@ -748,19 +739,19 @@ function parse(args, { "--": doubleDash = false , alias ={} , boolean: __boolean
     }
     const aliases = {};
     if (alias !== undefined) {
-        for(const key1 in alias){
-            const val = getForce(alias, key1);
+        for(const key in alias){
+            const val = getForce(alias, key);
             if (typeof val === "string") {
-                aliases[key1] = [
+                aliases[key] = [
                     val
                 ];
             } else {
-                aliases[key1] = val;
+                aliases[key] = val;
             }
-            for (const alias1 of getForce(aliases, key1)){
-                aliases[alias1] = [
-                    key1
-                ].concat(aliases[key1].filter((y)=>alias1 !== y));
+            for (const alias of getForce(aliases, key)){
+                aliases[alias] = [
+                    key
+                ].concat(aliases[key].filter((y)=>alias !== y));
             }
         }
     }
@@ -768,11 +759,11 @@ function parse(args, { "--": doubleDash = false , alias ={} , boolean: __boolean
         const stringArgs = typeof string === "string" ? [
             string
         ] : string;
-        for (const key2 of stringArgs.filter(Boolean)){
-            flags.strings[key2] = true;
-            const alias2 = get(aliases, key2);
-            if (alias2) {
-                for (const al of alias2){
+        for (const key of stringArgs.filter(Boolean)){
+            flags.strings[key] = true;
+            const alias = get(aliases, key);
+            if (alias) {
+                for (const al of alias){
                     flags.strings[al] = true;
                 }
             }
@@ -782,12 +773,12 @@ function parse(args, { "--": doubleDash = false , alias ={} , boolean: __boolean
         const collectArgs = typeof collect === "string" ? [
             collect
         ] : collect;
-        for (const key3 of collectArgs.filter(Boolean)){
-            flags.collect[key3] = true;
-            const alias3 = get(aliases, key3);
-            if (alias3) {
-                for (const al1 of alias3){
-                    flags.collect[al1] = true;
+        for (const key of collectArgs.filter(Boolean)){
+            flags.collect[key] = true;
+            const alias = get(aliases, key);
+            if (alias) {
+                for (const al of alias){
+                    flags.collect[al] = true;
                 }
             }
         }
@@ -796,12 +787,12 @@ function parse(args, { "--": doubleDash = false , alias ={} , boolean: __boolean
         const negatableArgs = typeof negatable === "string" ? [
             negatable
         ] : negatable;
-        for (const key4 of negatableArgs.filter(Boolean)){
-            flags.negatable[key4] = true;
-            const alias4 = get(aliases, key4);
-            if (alias4) {
-                for (const al2 of alias4){
-                    flags.negatable[al2] = true;
+        for (const key of negatableArgs.filter(Boolean)){
+            flags.negatable[key] = true;
+            const alias = get(aliases, key);
+            if (alias) {
+                for (const al of alias){
+                    flags.negatable[al] = true;
                 }
             }
         }
@@ -864,47 +855,47 @@ function parse(args, { "--": doubleDash = false , alias ={} , boolean: __boolean
         if (/^--.+=/.test(arg)) {
             const m = arg.match(/^--([^=]+)=(.*)$/s);
             assert(m != null);
-            const [, key5, value] = m;
-            if (flags.bools[key5]) {
+            const [, key, value] = m;
+            if (flags.bools[key]) {
                 const booleanValue = value !== "false";
-                setArg(key5, booleanValue, arg);
+                setArg(key, booleanValue, arg);
             } else {
-                setArg(key5, value, arg);
+                setArg(key, value, arg);
             }
         } else if (/^--no-.+/.test(arg) && get(flags.negatable, arg.replace(/^--no-/, ""))) {
-            const m1 = arg.match(/^--no-(.+)/);
-            assert(m1 != null);
-            setArg(m1[1], false, arg, false);
+            const m = arg.match(/^--no-(.+)/);
+            assert(m != null);
+            setArg(m[1], false, arg, false);
         } else if (/^--.+/.test(arg)) {
-            const m2 = arg.match(/^--(.+)/);
-            assert(m2 != null);
-            const [, key6] = m2;
+            const m = arg.match(/^--(.+)/);
+            assert(m != null);
+            const [, key] = m;
             const next = args[i + 1];
-            if (next !== undefined && !/^-/.test(next) && !get(flags.bools, key6) && !flags.allBools && (get(aliases, key6) ? !aliasIsBoolean(key6) : true)) {
-                setArg(key6, next, arg);
+            if (next !== undefined && !/^-/.test(next) && !get(flags.bools, key) && !flags.allBools && (get(aliases, key) ? !aliasIsBoolean(key) : true)) {
+                setArg(key, next, arg);
                 i++;
             } else if (/^(true|false)$/.test(next)) {
-                setArg(key6, next === "true", arg);
+                setArg(key, next === "true", arg);
                 i++;
             } else {
-                setArg(key6, get(flags.strings, key6) ? "" : true, arg);
+                setArg(key, get(flags.strings, key) ? "" : true, arg);
             }
         } else if (/^-[^-]+/.test(arg)) {
             const letters = arg.slice(1, -1).split("");
             let broken = false;
             for(let j = 0; j < letters.length; j++){
-                const next1 = arg.slice(j + 2);
-                if (next1 === "-") {
-                    setArg(letters[j], next1, arg);
+                const next = arg.slice(j + 2);
+                if (next === "-") {
+                    setArg(letters[j], next, arg);
                     continue;
                 }
-                if (/[A-Za-z]/.test(letters[j]) && /=/.test(next1)) {
-                    setArg(letters[j], next1.split(/=(.+)/)[1], arg);
+                if (/[A-Za-z]/.test(letters[j]) && /=/.test(next)) {
+                    setArg(letters[j], next.split(/=(.+)/)[1], arg);
                     broken = true;
                     break;
                 }
-                if (/[A-Za-z]/.test(letters[j]) && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next1)) {
-                    setArg(letters[j], next1, arg);
+                if (/[A-Za-z]/.test(letters[j]) && /-?\d+(\.\d*)?(e-?\d+)?$/.test(next)) {
+                    setArg(letters[j], next, arg);
                     broken = true;
                     break;
                 }
@@ -916,16 +907,16 @@ function parse(args, { "--": doubleDash = false , alias ={} , boolean: __boolean
                     setArg(letters[j], get(flags.strings, letters[j]) ? "" : true, arg);
                 }
             }
-            const [key7] = arg.slice(-1);
-            if (!broken && key7 !== "-") {
-                if (args[i + 1] && !/^(-|--)[^-]/.test(args[i + 1]) && !get(flags.bools, key7) && (get(aliases, key7) ? !aliasIsBoolean(key7) : true)) {
-                    setArg(key7, args[i + 1], arg);
+            const [key] = arg.slice(-1);
+            if (!broken && key !== "-") {
+                if (args[i + 1] && !/^(-|--)[^-]/.test(args[i + 1]) && !get(flags.bools, key) && (get(aliases, key) ? !aliasIsBoolean(key) : true)) {
+                    setArg(key, args[i + 1], arg);
                     i++;
                 } else if (args[i + 1] && /^(true|false)$/.test(args[i + 1])) {
-                    setArg(key7, args[i + 1] === "true", arg);
+                    setArg(key, args[i + 1] === "true", arg);
                     i++;
                 } else {
-                    setArg(key7, get(flags.strings, key7) ? "" : true, arg);
+                    setArg(key, get(flags.strings, key) ? "" : true, arg);
                 }
             }
         } else {
@@ -938,35 +929,35 @@ function parse(args, { "--": doubleDash = false , alias ={} , boolean: __boolean
             }
         }
     }
-    for (const [key8, value1] of Object.entries(defaults)){
-        if (!hasKey(argv, key8.split("."))) {
-            setKey(argv, key8, value1);
-            if (aliases[key8]) {
-                for (const x of aliases[key8]){
-                    setKey(argv, x, value1);
+    for (const [key, value] of Object.entries(defaults)){
+        if (!hasKey(argv, key.split("."))) {
+            setKey(argv, key, value);
+            if (aliases[key]) {
+                for (const x of aliases[key]){
+                    setKey(argv, x, value);
                 }
             }
         }
     }
-    for (const key9 of Object.keys(flags.bools)){
-        if (!hasKey(argv, key9.split("."))) {
-            const value2 = get(flags.collect, key9) ? [] : false;
-            setKey(argv, key9, value2, false);
+    for (const key of Object.keys(flags.bools)){
+        if (!hasKey(argv, key.split("."))) {
+            const value = get(flags.collect, key) ? [] : false;
+            setKey(argv, key, value, false);
         }
     }
-    for (const key10 of Object.keys(flags.strings)){
-        if (!hasKey(argv, key10.split(".")) && get(flags.collect, key10)) {
-            setKey(argv, key10, [], false);
+    for (const key of Object.keys(flags.strings)){
+        if (!hasKey(argv, key.split(".")) && get(flags.collect, key)) {
+            setKey(argv, key, [], false);
         }
     }
     if (doubleDash) {
         argv["--"] = [];
-        for (const key11 of notFlags){
-            argv["--"].push(key11);
+        for (const key of notFlags){
+            argv["--"].push(key);
         }
     } else {
-        for (const key12 of notFlags){
-            argv._.push(key12);
+        for (const key of notFlags){
+            argv._.push(key);
         }
     }
     return argv;
@@ -1011,9 +1002,9 @@ class BytesList {
             chunk.start += diff;
         }
         let offset = 0;
-        for (const chunk1 of this.#chunks){
-            chunk1.offset = offset;
-            offset += chunk1.end - chunk1.start;
+        for (const chunk of this.#chunks){
+            chunk.offset = offset;
+            offset += chunk.end - chunk.start;
         }
         this.#len = offset;
     }
@@ -1099,9 +1090,9 @@ function concat(...buf) {
     }
     const output = new Uint8Array(length);
     let index = 0;
-    for (const b1 of buf){
-        output.set(b1, index);
-        index += b1.length;
+    for (const b of buf){
+        output.set(b, index);
+        index += b.length;
     }
     return output;
 }
@@ -1324,10 +1315,10 @@ class BufReader {
         if (p.byteLength === 0) return rr;
         if (this.#r === this.#w) {
             if (p.byteLength >= this.#buf.byteLength) {
-                const rr1 = await this.#rd.read(p);
-                const nread = rr1 ?? 0;
+                const rr = await this.#rd.read(p);
+                const nread = rr ?? 0;
                 assert(nread >= 0, "negative read");
-                return rr1;
+                return rr;
             }
             this.#r = 0;
             this.#w = 0;
@@ -2120,14 +2111,14 @@ function utf8DecodeJs(bytes, inputOffset, byteLength) {
             const byte2 = bytes[offset++] & 0x3f;
             units.push((byte1 & 0x1f) << 6 | byte2);
         } else if ((byte1 & 0xf0) === 0xe0) {
-            const byte21 = bytes[offset++] & 0x3f;
+            const byte2 = bytes[offset++] & 0x3f;
             const byte3 = bytes[offset++] & 0x3f;
-            units.push((byte1 & 0x1f) << 12 | byte21 << 6 | byte3);
+            units.push((byte1 & 0x1f) << 12 | byte2 << 6 | byte3);
         } else if ((byte1 & 0xf8) === 0xf0) {
-            const byte22 = bytes[offset++] & 0x3f;
-            const byte31 = bytes[offset++] & 0x3f;
+            const byte2 = bytes[offset++] & 0x3f;
+            const byte3 = bytes[offset++] & 0x3f;
             const byte4 = bytes[offset++] & 0x3f;
-            let unit = (byte1 & 0x07) << 0x12 | byte22 << 0x0c | byte31 << 0x06 | byte4;
+            let unit = (byte1 & 0x07) << 0x12 | byte2 << 0x0c | byte3 << 0x06 | byte4;
             if (unit > 0xffff) {
                 unit -= 0x10000;
                 units.push(unit >>> 10 & 0x3ff | 0xd800);
@@ -2195,18 +2186,18 @@ function encodeTimeSpecToTimestamp({ sec , nsec  }) {
         } else {
             const secHigh = sec / 0x100000000;
             const secLow = sec & 0xffffffff;
-            const rv1 = new Uint8Array(8);
-            const view1 = new DataView(rv1.buffer);
-            view1.setUint32(0, nsec << 2 | secHigh & 0x3);
-            view1.setUint32(4, secLow);
-            return rv1;
+            const rv = new Uint8Array(8);
+            const view = new DataView(rv.buffer);
+            view.setUint32(0, nsec << 2 | secHigh & 0x3);
+            view.setUint32(4, secLow);
+            return rv;
         }
     } else {
-        const rv2 = new Uint8Array(12);
-        const view2 = new DataView(rv2.buffer);
-        view2.setUint32(0, nsec);
-        setInt64(view2, 4, sec);
-        return rv2;
+        const rv = new Uint8Array(12);
+        const view = new DataView(rv.buffer);
+        view.setUint32(0, nsec);
+        setInt64(view, 4, sec);
+        return rv;
     }
 }
 function encodeDateToTimeSpec(date) {
@@ -2242,20 +2233,20 @@ function decodeTimestampToTimeSpec(data) {
             {
                 const nsec30AndSecHigh2 = view.getUint32(0);
                 const secLow32 = view.getUint32(4);
-                const sec1 = (nsec30AndSecHigh2 & 0x3) * 0x100000000 + secLow32;
-                const nsec1 = nsec30AndSecHigh2 >>> 2;
+                const sec = (nsec30AndSecHigh2 & 0x3) * 0x100000000 + secLow32;
+                const nsec = nsec30AndSecHigh2 >>> 2;
                 return {
-                    sec: sec1,
-                    nsec: nsec1
+                    sec,
+                    nsec
                 };
             }
         case 12:
             {
-                const sec2 = getInt64(view, 4);
-                const nsec2 = view.getUint32(0);
+                const sec = getInt64(view, 4);
+                const nsec = view.getUint32(0);
                 return {
-                    sec: sec2,
-                    nsec: nsec2
+                    sec,
+                    nsec
                 };
             }
         default:
@@ -2302,13 +2293,13 @@ class ExtensionCodec {
                 }
             }
         }
-        for(let i1 = 0; i1 < this.encoders.length; i1++){
-            const encoder1 = this.encoders[i1];
-            if (encoder1 != null) {
-                const data1 = encoder1(object, context);
-                if (data1 != null) {
-                    const type1 = i1;
-                    return new ExtData(type1, data1);
+        for(let i = 0; i < this.encoders.length; i++){
+            const encoder = this.encoders[i];
+            if (encoder != null) {
+                const data = encoder(object, context);
+                if (data != null) {
+                    const type = i;
+                    return new ExtData(type, data);
                 }
             }
         }
@@ -2482,11 +2473,11 @@ class Encoder {
             utf8EncodeTE(object, this.bytes, this.pos);
             this.pos += byteLength;
         } else {
-            const byteLength1 = utf8Count(object);
-            this.ensureBufferSizeToWrite(maxHeaderSize + byteLength1);
-            this.writeStringHeader(byteLength1);
+            const byteLength = utf8Count(object);
+            this.ensureBufferSizeToWrite(maxHeaderSize + byteLength);
+            this.writeStringHeader(byteLength);
             utf8EncodeJs(object, this.bytes, this.pos);
-            this.pos += byteLength1;
+            this.pos += byteLength;
         }
     }
     encodeObject(object, depth) {
@@ -2896,9 +2887,9 @@ class Decoder {
                         object = {};
                     }
                 } else if (headByte < 0xa0) {
-                    const size1 = headByte - 0x90;
-                    if (size1 !== 0) {
-                        this.pushArrayState(size1);
+                    const size = headByte - 0x90;
+                    if (size !== 0) {
+                        this.pushArrayState(size);
                         this.complete();
                         continue DECODE;
                     } else {
@@ -2935,59 +2926,59 @@ class Decoder {
             } else if (headByte === 0xd3) {
                 object = this.readI64();
             } else if (headByte === 0xd9) {
-                const byteLength1 = this.lookU8();
-                object = this.decodeUtf8String(byteLength1, 1);
+                const byteLength = this.lookU8();
+                object = this.decodeUtf8String(byteLength, 1);
             } else if (headByte === 0xda) {
-                const byteLength2 = this.lookU16();
-                object = this.decodeUtf8String(byteLength2, 2);
+                const byteLength = this.lookU16();
+                object = this.decodeUtf8String(byteLength, 2);
             } else if (headByte === 0xdb) {
-                const byteLength3 = this.lookU32();
-                object = this.decodeUtf8String(byteLength3, 4);
+                const byteLength = this.lookU32();
+                object = this.decodeUtf8String(byteLength, 4);
             } else if (headByte === 0xdc) {
-                const size2 = this.readU16();
-                if (size2 !== 0) {
-                    this.pushArrayState(size2);
+                const size = this.readU16();
+                if (size !== 0) {
+                    this.pushArrayState(size);
                     this.complete();
                     continue DECODE;
                 } else {
                     object = [];
                 }
             } else if (headByte === 0xdd) {
-                const size3 = this.readU32();
-                if (size3 !== 0) {
-                    this.pushArrayState(size3);
+                const size = this.readU32();
+                if (size !== 0) {
+                    this.pushArrayState(size);
                     this.complete();
                     continue DECODE;
                 } else {
                     object = [];
                 }
             } else if (headByte === 0xde) {
-                const size4 = this.readU16();
-                if (size4 !== 0) {
-                    this.pushMapState(size4);
+                const size = this.readU16();
+                if (size !== 0) {
+                    this.pushMapState(size);
                     this.complete();
                     continue DECODE;
                 } else {
                     object = {};
                 }
             } else if (headByte === 0xdf) {
-                const size5 = this.readU32();
-                if (size5 !== 0) {
-                    this.pushMapState(size5);
+                const size = this.readU32();
+                if (size !== 0) {
+                    this.pushMapState(size);
                     this.complete();
                     continue DECODE;
                 } else {
                     object = {};
                 }
             } else if (headByte === 0xc4) {
-                const size6 = this.lookU8();
-                object = this.decodeBinary(size6, 1);
+                const size = this.lookU8();
+                object = this.decodeBinary(size, 1);
             } else if (headByte === 0xc5) {
-                const size7 = this.lookU16();
-                object = this.decodeBinary(size7, 2);
+                const size = this.lookU16();
+                object = this.decodeBinary(size, 2);
             } else if (headByte === 0xc6) {
-                const size8 = this.lookU32();
-                object = this.decodeBinary(size8, 4);
+                const size = this.lookU32();
+                object = this.decodeBinary(size, 4);
             } else if (headByte === 0xd4) {
                 object = this.decodeExtension(1, 0);
             } else if (headByte === 0xd5) {
@@ -2999,14 +2990,14 @@ class Decoder {
             } else if (headByte === 0xd8) {
                 object = this.decodeExtension(16, 0);
             } else if (headByte === 0xc7) {
-                const size9 = this.lookU8();
-                object = this.decodeExtension(size9, 1);
+                const size = this.lookU8();
+                object = this.decodeExtension(size, 1);
             } else if (headByte === 0xc8) {
-                const size10 = this.lookU16();
-                object = this.decodeExtension(size10, 2);
+                const size = this.lookU16();
+                object = this.decodeExtension(size, 2);
             } else if (headByte === 0xc9) {
-                const size11 = this.lookU32();
-                object = this.decodeExtension(size11, 4);
+                const size = this.lookU32();
+                object = this.decodeExtension(size, 4);
             } else {
                 throw new Error(`Unrecognized type byte: ${prettyByte(headByte)}`);
             }
@@ -4458,7 +4449,7 @@ function globToRegExp(glob, { extended =true , globstar: globstarOption = true ,
                         else if (value == "lower") segment += "a-z";
                         else if (value == "print") segment += "\x20-\x7E";
                         else if (value == "punct") {
-                            segment += "!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_‘{|}~";
+                            segment += "!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_ÔÇÿ{|}~";
                         } else if (value == "space") segment += "\\s\v";
                         else if (value == "upper") segment += "A-Z";
                         else if (value == "word") segment += "\\w";
@@ -5051,12 +5042,12 @@ function parseHistoryDetailId(id) {
             uuid
         };
     } else if (coopRE.test(plainText)) {
-        const [, uid1, timestamp1, uuid1] = plainText.match(coopRE);
+        const [, uid, timestamp, uuid] = plainText.match(coopRE);
         return {
             type: "CoopHistoryDetail",
-            uid: uid1,
-            timestamp: timestamp1,
-            uuid: uuid1
+            uid,
+            timestamp,
+            uuid
         };
     } else {
         throw new Error(`Invalid ID: ${plainText}`);
@@ -5081,55 +5072,75 @@ function urlSimplify(url) {
         return url;
     }
 }
-async function loginManually({ newFetcher , prompts: { promptLogin  }  }) {
+async function loginSteps({ newFetcher  }, step2) {
     const fetch = newFetcher();
-    const state = urlBase64Encode(random(36));
-    const authCodeVerifier = urlBase64Encode(random(32));
-    const authCvHash = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(authCodeVerifier));
-    const authCodeChallenge = urlBase64Encode(authCvHash);
-    const body = {
-        "state": state,
-        "redirect_uri": "npf71b963c1b7b6d119://auth",
-        "client_id": "71b963c1b7b6d119",
-        "scope": "openid user user.birthday user.mii user.screenName",
-        "response_type": "session_token_code",
-        "session_token_code_challenge": authCodeChallenge,
-        "session_token_code_challenge_method": "S256",
-        "theme": "login_form"
-    };
-    const url = "https://accounts.nintendo.com/connect/1.0.0/authorize?" + new URLSearchParams(body);
-    const res = await fetch.get({
-        url,
-        headers: {
-            "Host": "accounts.nintendo.com",
-            "Connection": "keep-alive",
-            "Cache-Control": "max-age=0",
-            "Upgrade-Insecure-Requests": "1",
-            "User-Agent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Mobile Safari/537.36",
-            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8n",
-            "DNT": "1",
-            "Accept-Encoding": "gzip,deflate,br"
+    if (!step2) {
+        const state = urlBase64Encode(random(36));
+        const authCodeVerifier = urlBase64Encode(random(32));
+        const authCvHash = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(authCodeVerifier));
+        const authCodeChallenge = urlBase64Encode(authCvHash);
+        const body = {
+            "state": state,
+            "redirect_uri": "npf71b963c1b7b6d119://auth",
+            "client_id": "71b963c1b7b6d119",
+            "scope": "openid user user.birthday user.mii user.screenName",
+            "response_type": "session_token_code",
+            "session_token_code_challenge": authCodeChallenge,
+            "session_token_code_challenge_method": "S256",
+            "theme": "login_form"
+        };
+        const url = "https://accounts.nintendo.com/connect/1.0.0/authorize?" + new URLSearchParams(body);
+        const res = await fetch.get({
+            url,
+            headers: {
+                "Host": "accounts.nintendo.com",
+                "Connection": "keep-alive",
+                "Cache-Control": "max-age=0",
+                "Upgrade-Insecure-Requests": "1",
+                "User-Agent": DEFAULT_APP_USER_AGENT,
+                "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8n",
+                "DNT": "1",
+                "Accept-Encoding": "gzip,deflate,br"
+            }
+        });
+        return {
+            authCodeVerifier,
+            url: res.url
+        };
+    } else {
+        const { login , authCodeVerifier  } = step2;
+        const loginURL = new URL(login);
+        const params = new URLSearchParams(loginURL.hash.substring(1));
+        const sessionTokenCode = params.get("session_token_code");
+        if (!sessionTokenCode) {
+            throw new Error("No session token code provided");
+        }
+        const sessionToken = await getSessionToken({
+            fetch,
+            sessionTokenCode,
+            authCodeVerifier
+        });
+        if (!sessionToken) {
+            throw new Error("No session token found");
         }
-    });
-    const login = (await promptLogin(res.url)).trim();
+        return {
+            sessionToken
+        };
+    }
+}
+async function loginManually(env) {
+    const { prompts: { promptLogin  }  } = env;
+    const step1 = await loginSteps(env);
+    const { url , authCodeVerifier  } = step1;
+    const login = (await promptLogin(url)).trim();
     if (!login) {
         throw new Error("No login URL provided");
     }
-    const loginURL = new URL(login);
-    const params = new URLSearchParams(loginURL.hash.substring(1));
-    const sessionTokenCode = params.get("session_token_code");
-    if (!sessionTokenCode) {
-        throw new Error("No session token code provided");
-    }
-    const sessionToken = await getSessionToken({
-        fetch,
-        sessionTokenCode,
-        authCodeVerifier
+    const step2 = await loginSteps(env, {
+        authCodeVerifier,
+        login
     });
-    if (!sessionToken) {
-        throw new Error("No session token found");
-    }
-    return sessionToken;
+    return step2.sessionToken;
 }
 async function getGToken({ fApi , sessionToken , env  }) {
     const fetch = env.newFetcher();
@@ -5460,7 +5471,7 @@ class Profile {
 }
 var Queries;
 (function(Queries) {
-    Queries["HomeQuery"] = "dba47124d5ec3090c97ba17db5d2f4b3";
+    Queries["HomeQuery"] = "22e2fa8294168003c21b00c333c35384";
     Queries["LatestBattleHistoriesQuery"] = "4f5f26e64bca394b45345a65a2f383bd";
     Queries["RegularBattleHistoriesQuery"] = "d5b795d09e67ce153e622a184b7e7dfa";
     Queries["BankaraBattleHistoriesQuery"] = "de4754588109b77dbcb90fbe44b612ee";
@@ -5468,7 +5479,7 @@ var Queries;
     Queries["PrivateBattleHistoriesQuery"] = "1d6ed57dc8b801863126ad4f351dfb9a";
     Queries["VsHistoryDetailQuery"] = "291295ad311b99a6288fc95a5c4cb2d2";
     Queries["CoopHistoryQuery"] = "6ed02537e4a65bbb5e7f4f23092f6154";
-    Queries["CoopHistoryDetailQuery"] = "3cc5f826a6646b85f3ae45db51bd0707";
+    Queries["CoopHistoryDetailQuery"] = "379f0d9b78b531be53044bcac031b34b";
     Queries["myOutfitCommonDataFilteringConditionQuery"] = "d02ab22c9dccc440076055c8baa0fa7a";
     Queries["myOutfitCommonDataEquipmentsQuery"] = "d29cd0c2b5e6bac90dd5b817914832f8";
     Queries["HistoryRecordQuery"] = "32b6771f94083d8f04848109b7300af5";
@@ -5594,7 +5605,7 @@ class Splatnet3 {
             return false;
         }
         try {
-            await this.request(Queries.HomeQuery);
+            await this.request(Queries.ConfigureAnalyticsQuery);
             return true;
         } catch (_e) {
             return false;
@@ -5843,8 +5854,8 @@ class StatInkAPI {
         }
     }
     _getAliasName(name) {
-        const STAT_INK_DOT = "·";
-        const SPLATNET_DOT = "‧";
+        const STAT_INK_DOT = "┬À";
+        const SPLATNET_DOT = "ÔÇº";
         if (name.includes(STAT_INK_DOT)) {
             return [
                 name,
@@ -5894,12 +5905,6 @@ class StatInkExporter {
         return vsMode.mode === "FEST" && b64Number(vsMode.id) === 8;
     }
     async exportGame(game) {
-        if (game.type === "VsInfo" && this.isTriColor(game.detail)) {
-            return {
-                status: "skip",
-                reason: "Tri-color fest is not supported"
-            };
-        }
         if (game.type === "VsInfo") {
             const body = await this.mapBattle(game);
             const { url  } = await this.api.postBattle(body);
@@ -5908,11 +5913,11 @@ class StatInkExporter {
                 url
             };
         } else {
-            const body1 = await this.mapCoop(game);
-            const { url: url1  } = await this.api.postCoop(body1);
+            const body = await this.mapCoop(game);
+            const { url  } = await this.api.postCoop(body);
             return {
                 status: "success",
-                url: url1
+                url
             };
         }
     }
@@ -5955,7 +5960,7 @@ class StatInkExporter {
             } else if (modeId === 7) {
                 return "splatfest_challenge";
             } else if (modeId === 8) {
-                throw new Error("Tri-color battle is not supported");
+                return "splatfest_open";
             }
         } else if (vsMode === "X_MATCH") {
             return "xmatch";
@@ -6009,6 +6014,7 @@ class StatInkExporter {
             weapon: b64Number(player.weapon.id).toString(),
             inked: player.paint,
             gears: await this.mapGears(player),
+            crown: player.crown ? "yes" : "no",
             disconnected: player.result ? "no" : "yes"
         };
         if (player.result) {
@@ -6016,6 +6022,7 @@ class StatInkExporter {
             result.assist = player.result.assist;
             result.kill = result.kill_or_assist - result.assist;
             result.death = player.result.death;
+            result.signal = player.result.noroshiTry ?? undefined;
             result.special = player.result.special;
         }
         return result;
@@ -6027,6 +6034,9 @@ class StatInkExporter {
             throw new Error("Self not found");
         }
         const startedAt = Math.floor(new Date(playedTime).getTime() / 1000);
+        if (otherTeams.length === 0) {
+            throw new Error(`Other teams is empty`);
+        }
         const result = {
             uuid: await gameId(vsDetail.id),
             lobby: this.mapLobby(vsDetail),
@@ -6038,7 +6048,7 @@ class StatInkExporter {
             rank_in_team: vsDetail.myTeam.players.indexOf(self) + 1,
             medals: vsDetail.awards.map((i)=>i.name),
             our_team_players: await Promise.all(myTeam.players.map(this.mapPlayer)),
-            their_team_players: await Promise.all(otherTeams.flatMap((i)=>i.players).map(this.mapPlayer)),
+            their_team_players: await Promise.all(otherTeams[0].players.map(this.mapPlayer)),
             agent: AGENT_NAME,
             agent_version: S3SI_VERSION,
             agent_variables: {
@@ -6053,18 +6063,47 @@ class StatInkExporter {
             result.assist = self.result.assist;
             result.kill = result.kill_or_assist - result.assist;
             result.death = self.result.death;
+            result.signal = self.result.noroshiTry ?? undefined;
             result.special = self.result.special;
         }
+        result.our_team_color = this.mapColor(myTeam.color);
+        result.their_team_color = this.mapColor(otherTeams[0].color);
+        if (otherTeams.length === 2) {
+            result.third_team_color = this.mapColor(otherTeams[1].color);
+        }
         if (festMatch) {
             result.fest_dragon = SPLATNET3_STATINK_MAP.DRAGON[festMatch.dragonMatchType];
             result.clout_change = festMatch.contribution;
             result.fest_power = festMatch.myFestPower ?? undefined;
         }
-        if (rule === "TURF_WAR") {
+        if (rule === "TURF_WAR" || rule === "TRI_COLOR") {
             result.our_team_percent = (myTeam?.result?.paintRatio ?? 0) * 100;
             result.their_team_percent = (otherTeams?.[0]?.result?.paintRatio ?? 0) * 100;
             result.our_team_inked = myTeam.players.reduce((acc, i)=>acc + i.paint, 0);
             result.their_team_inked = otherTeams?.[0].players.reduce((acc, i)=>acc + i.paint, 0);
+            if (myTeam.festTeamName) {
+                result.our_team_theme = myTeam.festTeamName;
+            }
+            if (myTeam.tricolorRole) {
+                result.our_team_role = myTeam.tricolorRole === "DEFENSE" ? "defender" : "attacker";
+            }
+            if (otherTeams[0].festTeamName) {
+                result.their_team_theme = otherTeams[0].festTeamName;
+            }
+            if (otherTeams[0].tricolorRole) {
+                result.their_team_role = otherTeams[0].tricolorRole === "DEFENSE" ? "defender" : "attacker";
+            }
+            if (otherTeams.length === 2) {
+                result.third_team_players = await Promise.all(otherTeams[1].players.map(this.mapPlayer));
+                result.third_team_percent = (otherTeams[1]?.result?.paintRatio ?? 0) * 100;
+                result.third_team_inked = otherTeams[1].players.reduce((acc, i)=>acc + i.paint, 0);
+                if (otherTeams[1].festTeamName) {
+                    result.third_team_theme = otherTeams[1].festTeamName;
+                }
+                if (otherTeams[1].tricolorRole) {
+                    result.third_team_role = otherTeams[1].tricolorRole === "DEFENSE" ? "defender" : "attacker";
+                }
+            }
         }
         if (knockout) {
             result.knockout = knockout === "NEITHER" ? "no" : "yes";
@@ -6100,9 +6139,6 @@ class StatInkExporter {
             result.rank_after_exp = rankState.rankPoint;
             if (!bankaraMatchChallenge?.isUdemaeUp && result.rank_exp_change === undefined) {
                 result.rank_exp_change = result.rank_after_exp - result.rank_before_exp;
-            } else if (bankaraMatchChallenge?.isUdemaeUp && bankaraMatchChallenge.earnedUdemaePoint) {
-                result.rank_before_exp = result.rank_after_exp - bankaraMatchChallenge.earnedUdemaePoint;
-                result.rank_exp_change = undefined;
             }
             if (!result.rank_after) {
                 [result.rank_after, result.rank_after_s_plus] = parseUdemae(rankState.rank);
@@ -6110,6 +6146,16 @@ class StatInkExporter {
         }
         return result;
     }
+    mapColor(color) {
+        const float2hex = (i)=>Math.round(i * 255).toString(16).padStart(2, "0");
+        const nums = [
+            color.r,
+            color.g,
+            color.b,
+            color.a
+        ];
+        return nums.map(float2hex).join("");
+    }
     isRandom(image) {
         const RANDOM_FILENAME = "473fffb2442075078d8bb7125744905abdeae651b6a5b7453ae295582e45f7d1";
         const url = image?.url;
@@ -6158,7 +6204,7 @@ class StatInkExporter {
             name: player.name,
             number: player.nameId,
             splashtag_title: player.byname,
-            uniform: SPLATNET3_STATINK_MAP.COOP_UNIFORM_MAP[b64Number(player.uniform.id)],
+            uniform: b64Number(player.uniform.id).toString(),
             special: specialWeapon ? await this.mapSpecial(specialWeapon) : undefined,
             weapons: await Promise.all(weapons.map((w)=>this.mapCoopWeapon(w))),
             golden_eggs: goldenDeliverCount,
@@ -6310,7 +6356,7 @@ class FileExporter {
         const { uid , timestamp  } = parseHistoryDetailId(id);
         return `${uid}_${timestamp}Z.json`;
     }
-    async exportedGames({ uid , type  }) {
+    async exportedGames({ uid , type , filter  }) {
         const out = [];
         for await (const entry of Deno.readDir(this.exportPath)){
             const filename = entry.name;
@@ -6325,12 +6371,18 @@ class FileExporter {
                 continue;
             }
             if (body.type === "VS" && type === "VsInfo") {
+                if (filter && !filter(body.data)) {
+                    continue;
+                }
                 out.push({
                     id: body.data.detail.id,
                     filepath,
                     timestamp
                 });
             } else if (body.type === "COOP" && type === "CoopInfo") {
+                if (filter && !filter(body.data)) {
+                    continue;
+                }
                 out.push({
                     id: body.data.detail.id,
                     filepath,
@@ -6405,6 +6457,29 @@ class FileExporter {
     }
     exportPath;
 }
+const SEASONS = [
+    {
+        id: "season202209",
+        name: "Drizzle Season 2022",
+        start: new Date("2022-09-01T00:00:00+00:00"),
+        end: new Date("2022-12-01T00:00:00+00:00")
+    },
+    {
+        id: "season202212",
+        name: "Chill Season 2022",
+        start: new Date("2022-12-01T00:00:00+00:00"),
+        end: new Date("2023-03-01T00:00:00+00:00")
+    },
+    {
+        id: "season202303",
+        name: "Fresh Season 2023",
+        start: new Date("2023-03-01T00:00:00+00:00"),
+        end: new Date("2023-06-01T00:00:00+00:00")
+    }
+];
+const getSeason = (date)=>{
+    return SEASONS.find((s)=>s.start <= date && date < s.end);
+};
 const splusParams = ()=>{
     const out = [];
     for(let i = 0; i < 50; i++){
@@ -6520,8 +6595,27 @@ const RANK_PARAMS = [
     ...splusParams()
 ];
 function addRank(state, delta) {
+    if (!state) {
+        if (delta.isPromotion && delta.isRankUp) {
+            state = getRankStateByDelta(delta);
+        } else {
+            return;
+        }
+    }
+    if (state.gameId !== delta.before.gameId) {
+        throw new Error("Invalid state");
+    }
     const { rank , rankPoint  } = state;
     const { gameId , timestamp , rankAfter , isPromotion , isRankUp , isChallengeFirst  } = delta;
+    if (state.timestamp) {
+        const oldSeason = getSeason(new Date(state.timestamp * 1000));
+        if (oldSeason) {
+            const newSeason = getSeason(new Date(timestamp * 1000));
+            if (newSeason?.id !== oldSeason.id) {
+                return;
+            }
+        }
+    }
     const rankIndex = RANK_PARAMS.findIndex((r)=>r.rank === rank);
     if (rankIndex === -1) {
         throw new Error(`Rank not found: ${rank}`);
@@ -6529,34 +6623,46 @@ function addRank(state, delta) {
     const rankParam = RANK_PARAMS[rankIndex];
     if (isChallengeFirst) {
         return {
-            gameId,
-            timestamp,
-            rank,
-            rankPoint: rankPoint - rankParam.charge
+            before: state,
+            after: {
+                gameId,
+                timestamp,
+                rank,
+                rankPoint: rankPoint - rankParam.charge
+            }
         };
     }
     if (rankIndex === RANK_PARAMS.length - 1) {
         return {
-            timestamp,
-            gameId,
-            rank,
-            rankPoint: Math.min(rankPoint + delta.rankPoint, rankParam.pointRange[1])
+            before: state,
+            after: {
+                timestamp,
+                gameId,
+                rank,
+                rankPoint: Math.min(rankPoint + delta.rankPoint, rankParam.pointRange[1])
+            }
         };
     }
     if (isPromotion && isRankUp) {
         const nextRankParam = RANK_PARAMS[rankIndex + 1];
         return {
-            gameId,
-            timestamp,
-            rank: nextRankParam.rank,
-            rankPoint: nextRankParam.pointRange[0]
+            before: state,
+            after: {
+                gameId,
+                timestamp,
+                rank: nextRankParam.rank,
+                rankPoint: nextRankParam.pointRange[0]
+            }
         };
     }
     return {
-        gameId,
-        timestamp,
-        rank: rankAfter ?? rank,
-        rankPoint: rankPoint + delta.rankPoint
+        before: state,
+        after: {
+            gameId,
+            timestamp,
+            rank: rankAfter ?? rank,
+            rankPoint: rankPoint + delta.rankPoint
+        }
     };
 }
 const battleTime = (id)=>{
@@ -6564,32 +6670,56 @@ const battleTime = (id)=>{
     const dateStr = timestamp.replace(/(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6Z");
     return new Date(dateStr);
 };
-function generateDeltaList(state, flatten) {
-    const index = flatten.findIndex((i)=>i.gameId === state.gameId);
-    if (index === -1) {
-        return;
+function beginPoint(state, flatten) {
+    if (state) {
+        const index = flatten.findIndex((i)=>i.gameId === state.gameId);
+        if (index !== -1) {
+            return [
+                flatten[index],
+                flatten.slice(index)
+            ];
+        }
+    }
+    if (flatten.length === 0) {
+        throw new Error("flatten must not be empty");
     }
-    const unProcessed = flatten.slice(index);
+    return [
+        flatten[0],
+        flatten
+    ];
+}
+function getTimestamp(date) {
+    return Math.floor(date.getTime() / 1000);
+}
+function generateDeltaList(state, flatten) {
+    const [firstItem, unProcessed] = beginPoint(state, flatten);
     const deltaList = [];
-    let beforeGameId = state.gameId;
+    let before = {
+        gameId: firstItem.gameId,
+        timestamp: getTimestamp(firstItem.time)
+    };
     for (const i of unProcessed.slice(1)){
         if (!i.detail.bankaraMatch) {
             throw new TypeError("bankaraMatch must be defined");
         }
         let delta = {
-            beforeGameId,
+            before,
             gameId: i.gameId,
-            timestamp: Math.floor(i.time.getTime() / 1000),
+            timestamp: getTimestamp(i.time),
             rankPoint: 0,
             isPromotion: false,
             isRankUp: false,
             isChallengeFirst: false
         };
-        beforeGameId = i.gameId;
+        before = {
+            gameId: i.gameId,
+            timestamp: Math.floor(i.time.getTime() / 1000)
+        };
         if (i.bankaraMatchChallenge) {
             if (i.index === 0 && i.bankaraMatchChallenge.state !== "INPROGRESS") {
                 delta = {
                     ...delta,
+                    rank: i.detail.udemae,
                     rankAfter: i.bankaraMatchChallenge.udemaeAfter ?? undefined,
                     rankPoint: i.bankaraMatchChallenge.earnedUdemaePoint ?? 0,
                     isPromotion: i.bankaraMatchChallenge.isPromo ?? false,
@@ -6611,52 +6741,42 @@ function generateDeltaList(state, flatten) {
         }
         deltaList.push(delta);
     }
-    return deltaList;
+    return {
+        firstItem,
+        deltaList
+    };
 }
-function getRankState(i) {
-    const rank = i.detail.udemae;
-    if (!rank) {
-        throw new Error("rank must be defined");
+function getRankStateByDelta(i) {
+    const rank = i.rank;
+    const nextRank = i.rankAfter;
+    const earnedUdemaePoint = i.rankPoint;
+    if (!rank || !nextRank) {
+        throw new Error("rank and nextRank must be defined");
     }
     const param = RANK_PARAMS.find((i)=>i.rank === rank);
-    if (!param) {
-        throw new Error(`Rank not found: ${rank}`);
+    const nextParam = RANK_PARAMS.find((i)=>i.rank === nextRank);
+    if (!param || !nextParam) {
+        throw new Error(`Rank or nextRank not found: ${rank} ${nextRank}`);
     }
+    const oldRankPoint = nextParam.pointRange[0] - earnedUdemaePoint;
     return {
-        gameId: i.gameId,
-        timestamp: Math.floor(i.time.getTime() / 1000),
+        gameId: i.before.gameId,
+        timestamp: i.before.timestamp,
         rank,
-        rankPoint: -1
+        rankPoint: oldRankPoint
     };
 }
 class RankTracker {
     deltaMap;
+    stateMap;
     constructor(state){
         this.state = state;
         this.deltaMap = new Map();
+        this.stateMap = new Map();
     }
     async getRankStateById(id) {
-        if (!this.state) {
-            return;
-        }
         const gid = await gameId(id);
-        let cur = this.state;
-        let before = cur;
-        if (cur.gameId === gid) {
-            return;
-        }
-        while(cur.gameId !== gid){
-            const delta = this.deltaMap.get(cur.gameId);
-            if (!delta) {
-                return;
-            }
-            before = cur;
-            cur = addRank(cur, delta);
-        }
-        return {
-            before,
-            after: cur
-        };
+        return this.stateMap.get(gid);
     }
     setState(state) {
         this.state = state;
@@ -6676,37 +6796,18 @@ class RankTracker {
                     ...i,
                     gameId
                 }))));
-        const gameIdTime = new Map(flatten.map((i)=>[
-                i.gameId,
-                i.time
-            ]));
-        let curState;
-        const oldestPromotion = flatten.find((i)=>i.bankaraMatchChallenge?.isPromo && i.bankaraMatchChallenge.isUdemaeUp);
-        const thisStateTime = gameIdTime.get(this.state?.gameId);
-        if (!thisStateTime && !oldestPromotion) {
-            return;
-        } else if (thisStateTime && !oldestPromotion) {
-            curState = this.state;
-        } else if (!thisStateTime && oldestPromotion) {
-            curState = getRankState(oldestPromotion);
-        } else if (thisStateTime && oldestPromotion) {
-            if (thisStateTime <= oldestPromotion.time) {
-                curState = this.state;
-            } else {
-                curState = getRankState(oldestPromotion);
-            }
-        }
-        if (!curState) {
-            return;
-        }
-        this.state = curState;
-        const deltaList = generateDeltaList(curState, flatten);
-        if (!deltaList) {
+        let curState = this.state;
+        const { firstItem , deltaList  } = generateDeltaList(curState, flatten);
+        if (curState && firstItem.gameId !== curState.gameId) {
             return;
         }
         for (const delta of deltaList){
-            this.deltaMap.set(delta.beforeGameId, delta);
-            curState = addRank(curState, delta);
+            this.deltaMap.set(delta.before.gameId, delta);
+            const result = addRank(curState, delta);
+            curState = result?.after;
+            if (result) {
+                this.stateMap.set(result.after.gameId, result);
+            }
         }
         return curState;
     }
@@ -7072,26 +7173,26 @@ class App {
         } else {
             this.env.logger.log("Fetching coop battle list...");
             const coopBattleList = await splatnet.getBattleList(BattleListType.Coop);
-            const { redraw: redraw1 , endBar: endBar1  } = this.exporterProgress("Export coop games");
-            const fetcher1 = new GameFetcher({
+            const { redraw , endBar  } = this.exporterProgress("Export coop games");
+            const fetcher = new GameFetcher({
                 cache: this.opts.cache ?? new FileCache(this.profile.state.cacheDir),
                 state: this.profile.state,
                 splatnet
             });
             await Promise.all(exporters.map((e)=>showError(this.env, this.exportGameList({
                     type: "CoopInfo",
-                    fetcher: fetcher1,
+                    fetcher,
                     exporter: e,
                     gameList: coopBattleList,
                     stepProgress: stats[e.name],
                     onStep: ()=>{
-                        redraw1(e.name, progress(stats[e.name]));
+                        redraw(e.name, progress(stats[e.name]));
                     }
                 })).catch((err)=>{
                     errors.push(err);
                     this.env.logger.error(`\nFailed to export to ${e.name}:`, err);
                 })));
-            endBar1();
+            endBar();
             this.printStats(stats);
             if (errors.length > 0) {
                 throw errors[0];
diff --git a/source/plugins/community/splatoon/token.ts b/source/plugins/community/splatoon/token.ts
index 71641c91d07..dff26365ef7 100644
--- a/source/plugins/community/splatoon/token.ts
+++ b/source/plugins/community/splatoon/token.ts
@@ -31,15 +31,16 @@ const args = [
   '--exporter=none'
 ]
 try {
-  await Deno.spawn("deno", {
+  const command = new Deno.Command("deno", {
     args,
     stdin: "inherit",
     stdout: "inherit",
     stderr: "inherit",
     windowsRawArguments:true
   })
+  await command.output()
 }
-catch {}
+catch (error) { console.log(error) }
 
 //Extract profile.json and print instructions
 try {

From 41db331746b046d814d77621e4e8441814b587a3 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Mar 2023 20:33:14 -0400
Subject: [PATCH 091/196] fix(plugins/steam): placeholder and extra log

---
 .../app/web/statics/embed/app.placeholder.js  | 26 +++++++++----------
 source/plugins/steam/index.mjs                |  1 -
 2 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/source/app/web/statics/embed/app.placeholder.js b/source/app/web/statics/embed/app.placeholder.js
index da229afdc5f..7bb35ab140c 100644
--- a/source/app/web/statics/embed/app.placeholder.js
+++ b/source/app/web/statics/embed/app.placeholder.js
@@ -1039,16 +1039,16 @@
         ...(set.plugins.enabled.steam
           ? ({
             steam: {
-              sections: options["anilist.sections"].split(",").map(x => x.trim()).filter(x => x),
+              sections: options["steam.sections"].split(",").map(x => x.trim()).filter(x => x),
               player: {
                 level: faker.datatype.number(100),
                 avatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
-                created: 1366386002,
+                created: faker.date.recent(10).getTime(),
                 name: faker.internet.userName(),
               },
               games: {
                 count: 2,
-                playtime: 89.23333333333333,
+                playtime: faker.datatype.number(1000),
                 achievements: 0,
                 "most-played": [
                   {
@@ -1056,8 +1056,8 @@
                     name: "NieR:Automata™",
                     icon:
                       "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCABAAEADASIAAhEBAxEB/8QAHAAAAgMBAQEBAAAAAAAAAAAABgcFCAkEAwEA/8QAMBAAAQMDAwEGBQQDAAAAAAAAAQIDBAAFEQYHITESExQiQVEjMkJhcQhSobEVgcH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8ArPebk9cpIW+U8D0FcJUTj39q+Kxnjp6VN6N0zcdV3xi12lpTjzqgCoDIQPc0EKlZ6YJI6Yrvt1oudwIRAhPPqV+1NXb252F01pmHGfuDHjLoPMtazlGfbsmmoxZbXHwI9uhN4/aykH+qDNa5afvNsBE+3vsgj6k1EqKgeRhXTmtQXbTb3jh6BEcT7LZSo/yKXevNktKaqbkOGGIk5acNuMnsJSfwKCgXbUlWfqrpts12DLS8zgqB5yKJNydDXLQl9ct9xQe7J+G5jhQ9KEU/MMUH5XUZOR9qu1+l7Q8fS+jDfLk0lufLyVLWPlb6giqdaYgpueorfDI8rzoSRWhGpbZKe20MK15D6YiEoSnqSAKCMTuzZv8AMeFUy6Ifb7vx2fhAjqKYTD7chpDzCgttYCkqHQikM3fbEnbB6yqhpevThU34NKfi9vI82cUz9EKfs+lILd+eS24oAISRykY4BoC5RwCSQPzS9uu6tmgXZcRCHJEdo4elIPkb980R3iWLvZp8ayS21TO78uOopC27VtqsGjLzpm/2l1m8rU4UhxIKpBUrjBxQMHfPSkDX+3L8yEEPSmGy9GcQOSeOKoU60piQ404PM2opUPYjitDNl7XPg6Ebau6VBTqlLS2vqlB6CqQbsWtFn3AusZsdlJcLmPyTQRGkZibfqq2ynD5Wngo1ou5Pks6et8yE33iCyhS04z5SkVmecpWCnqORV7/0266Z1ZoliHJfQq5RPI40evYHAoCKdqvR0BwyViCLljPd9gBeag7rutF75pk2N98k+TBHP4rx3F2YiX68qvlqfVGuSQMIUSUEj7UAzdtNwo0pl+LLjPOtqzgNelAwY+58W3zA2rT8lhx35jkDipuJrLRV5mI8aICbik5Sh5sKXn84pSx9ttwrhOW7cJUdBUAAe66Ue6G2WhWq6ovF+f8AG3JGCgtkpQD9x60DMtEp+WHHFoCI2MN4GOKz73lnouW410eRyAstjHuCauzvNrGLonQ81/vEty3GyiMgcEqrPSXJXMmyJLxy68srJ+5OaDxX81EOhNWXHR1/YudsdUlTagVIB4UPYioi4wZEJ/upCCleM1yhJ59KC/8AtzvRpnV8NhLstuFcSACw6rlSvXFM5JT84UCFDg54rLZpx1hxLsdS2lJ6KScEf7ootm4OqbatCmLvJV2eneOFQ/ug0jzzyefzQDr3dfTOjWHRMnNPTUDiM2rzVR27bjaruR7Ui7SEk8ZbWU/9oXlyZEt0uS3nH3T9S1FR/mgLd0df3LXl9cmTVqEYKIaazwkenFBaeo9K+dk56V7w4zsqQGWkFS1dAKD/2Q==",
-                    playtime: 44.88333333333333,
-                    played: 1582407120,
+                    playtime: faker.datatype.number(100),
+                    played: faker.date.recent(10).getTime(),
                     description: "NieR: Automata tells the story of androids 2B, 9S and A2 and their battle to reclaim the machine-driven dystopia overrun by powerful machines.",
                     genres: [
                       "Action",
@@ -1068,7 +1068,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUGBwP/xAAmEAABAgQDCQAAAAAAAAAAAAABAAIDBAUGBxIUFiMxNVNhc5Gx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAME/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A6XVcM5QqlppTK+G4GJvSXEEngOyT7d1TpwPRRiVz5niH0qTWNVWbd1TpwPRTi1bhnK7UtNN5WQ2gRN0S0kg8D2Wdqsw158/xH6EBiVz5niH0qTWiXVb05XalqZTKyG0GHvQWkkHiOyT7CVTqQPZQSarMNefP8R+hGwlU6kD2U4tW3pyhVLUzeV8NwEPdAuIJPE9kH//Z",
                         achieved: true,
-                        unlocked: 1565976624,
+                        unlocked: faker.date.recent(10).getTime(),
                         name: "Transcendent Being",
                         description: "",
                         id: "ACH_BAD_END",
@@ -1077,7 +1077,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAABQQDAAL/xAAtEAABAwMCBAQGAwAAAAAAAAABAgMEAAURBiISITFBExQjMlFhcYGRsRXB0f/EABcBAQEBAQAAAAAAAAAAAAAAAAABAwT/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwC3UF7lWeeY8bc2rLnqKJIJPT6VhE1BdpCgAhtORy2qJ/ArxqprxtRIB7IH7pixMJZfZWOQPEB+DXG1FSL/AHhj3soB64IINU6evMm8TvLytqEYX6aikkg9D8vlSmomEPcK8hWEYIznuaE0uz4N/cx3R/dQdqdt3+cDkfgUtLZ2LOAr4DPaqbOiDeZrcW4w5cd2Mkq3HiQVBW4Ajl7eX3OOlb3W2yLjMMiPxJSklO9JByDjP0q+2tzIiAlyO27j4k1QfdotvsD7zjEOa9Hkoy64yBhrh6de2P1U2mXmpN2W8wh5Dakjh8UYKh3OKcuKZUpspbitNkjBOT/tHWu3yLfN8xJClpWQnYkqIyeX2oP/2Q==",
                         achieved: true,
-                        unlocked: 1565976316,
+                        unlocked: faker.date.recent(10).getTime(),
                         name: "A Round by the Pond",
                         description: "20 different kinds of fish caught.",
                         id: "ACH_FISHING",
@@ -1085,7 +1085,7 @@
                     ],
                     rate: {
                       total: 47,
-                      achieved: 47,
+                      achieved: 2 + faker.datatype.number(45),
                     },
                   },
                 ],
@@ -1095,8 +1095,8 @@
                     name: "NieR Replicant ver.1.22474487139...",
                     icon:
                       "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCABAAEADASIAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAABgcDBQEECAIA/8QAMBAAAQMDAgUCBgEFAQAAAAAAAQIDBAAFERIhBhMxQVEHYRQiIzJCcRUIJFJigcH/xAAYAQADAQEAAAAAAAAAAAAAAAABAgMABP/EAB8RAAICAwACAwAAAAAAAAAAAAABAhEDEiEEQSIxYf/aAAwDAQACEQMRAD8A6m228CgT1PmN/DtMDd1s6z+jRfebg3abVJnSN2mEa1fqubeKOOBxNcBYoTwTcpaylxfX6Z+0DwaWT9FsMbezNluY5e3Jdpt0hoMqRh94jIx4HvV9ZbVHs0NMa3r5YTuvmb6vcV9Bsjdkt6GorJ0gfMvuVd81aWpUfWEqBKldSqpHV+lhHZCmNTbqSfyFYdjoQgKdSS0fzHQVOuGIriXUk8rqfet55DcVkTYg5jB+9pW9YWynjKkR5BcjFL7H+o3o1tPEbbiEtyxy1dM0K3S2amhMthUjI1AZ2J8YrUtt6DTyBcGg2UnAKhso0U6BKCmi09dLkm3cEvLdUUtuZSrfqKQ/oPbbchM6+SAVzHCUoKznAB2xTj/qVZMn08faQkqdVnTjzQF6dQmWOD4fKQOcjdxI/VNJ0LiXxDNy5FlvXo5jRPzHskeTUciNFmR0vwZCQ71Tg7ZoUeW6J5nWtZkxSdDzIOdGKEo/FlxmcQqZiwHmilWFJ7Y84qd2X1G1br4/8O7BeSEuDrqGc/qpLZc+RJMaUfpObJBPehlm6KU+0uc1yXBsVEdRUvEENu5RNKlrQtr6jC0Kxk1vsDjQfEKjRgw25g5K0at+teNUG5RXTIbCHEjC09/2KHrRc0XaAwlSyHUfTO++1ef5Q2+4FqajY7ax0Ioi6tBd6o2r+QjxtassqUQR2G1IK4sXPh65MXC3zELjh0pcjAbhI710h6gsvOWlHJISkElRPakTxE6yxqclIPwh+Vah296M+MGDsFZZw1CU4LjDQYsh0AOxldFjyBWxHgMc9UlLaQ6vZeBUMN2JCjMhb6dKkhSD3welbLMqDJePwMlLjgGVpT2qTtnSlqZlRfiHmFLwW0KyoeR4qJUpLbHORlbTSjgf+VsPvKDiUspKlDqmhuXJ+HYfLSgVJJOj/I+KMX6Fkm+klhuTFr4mXHQomPJwUgncKO5ovvqorrzSJK0pc/An8vakxeHC1Li3SM5qTHXrUQe/cVf8cX1f8FAfOdThyhwHocU9E2unQ/EUkXO3PvNqKYUdOvmdnD4pK8ZRFOfGW6WOWmUyChRGwB3FP3iRtL1qctkZCUuSRpAA2T7mgj1UtammLNISxzQkhp9SR9oCetPJeyGGdcOd/TG4G7zXbBc1KE2EsqjLUdl74A99qawZgWNouTHWoh/LVjKjSC9WZbNt4nactWuNNbOoqScZHagGVcrlOK3JEyS7k5IU4SKDx7O0Os+q1as6Ru/FYkkpgILLWcKWo/cPY0u+LuNmYrzTMJfMcZOsqB2UT2pdyOILm+xyVu4RpCfl2OKqMkryrJPcmtHHTthyeTaqKDnh3idtiW9FkkqgSDqyo50LO5/5RFd7wzcOCp0DX/cxAXU7/iemKUmQVbZx4qQOuDOHFZIwd+o8GncVdkFmdas//9k=",
-                    playtime: 44.35,
-                    played: 1625611102,
+                    playtime: faker.datatype.number(100),
+                    played: faker.date.recent(10).getTime(),
                     description: "The upgraded prequel of NieR:Automata. A kind young man sets out with Grimoire Weiss, a strange talking book, to search for the &quot;Sealed verses&quot; in order to save his sister Yonah, who fell terminally ill to the Black Scrawl.",
                     genres: [
                       "Action",
@@ -1108,7 +1108,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAwUGBAL/xAAsEAACAgEDAwMDAwUAAAAAAAABAgMEBQAGERIhMSJBUQdhkRMUoRVDUnGz/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/xAAYEQEBAQEBAAAAAAAAAAAAAAABACERMf/aAAwDAQACEQMRAD8AsL+R3Jkd+5LEYnIrSr1Yo2QGFGDcqpJLEE88t4+2rbA08hXQDJ5N70jEDkxIgX/XSBzoWMxpr5vK3XPa08ZUD2CoF/PY6lZs7uaDaW9LmTr16NnHGT9nJGvVwvSCOxPq4DDhu3f21fcJ5a89nb8eKwVqKZ68mTtCoqxlAFLu3Qx6lbn0qPHzrNHlM5S3thcdcumercezDIpVCrGOIOGUhVIIblSD8ffSjIY3LZPZGzYzXS3LjpoLd4GRY1SJULBT1Hu3Qy/Y9/GqLH4dpc7jrP8ASWoVcfLI9UGRWLCVGMh4UkKvUV4HnudXCk+x+XisZ3IYz+9VCNz8hlB/jn+dSP1ZuGrs/dNeM8SW3pRIB5P6pCH/AJnXGWo7mxu/psvhKAvU7CKsimRF6V4UMOGYEN6fPfzphujZ1rPSLPDk7UD8wSiKZ+tVkicsvt7Bm4+CffUOCMYONyd/IboyG344QsVXJdVtyhCrVijjWNAf8pGX8Bu3fVVdz9SvuOhhnk5u3EeQIO5CgE8n8HSXBbZtbeny08Vy1dSy5siL9YiWWXjv1sex5+dI8Bh9yZL6hRbg3Jj4aaVYmihCOpBUhgPDE8+s8nto8Zt//9k=",
                         achieved: true,
-                        unlocked: 1625610706,
+                        unlocked: faker.date.recent(10).getTime(),
                         name: "e8 a8 98 e6 86 b6 e3 82 b5 e3 83 bc e3 83 90 e3 83 bc",
                         description: "",
                         id: "ACHIEVEMENT_0230",
@@ -1117,7 +1117,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAABgQFBwP/xAAsEAACAQQBAwIFBAMAAAAAAAABAgMEBQYRABIhMSJBBxMUUaEVIzJhUnGC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/8QAGhEAAwEBAQEAAAAAAAAAAAAAAAERIUExMv/aAAwDAQACEQMRAD8AXZJe7vT5DVJLe1sVvR1hgeeCN4JGIH8pvV0MdghXC/0TxvY6S4UsJ/Urm9fIwBBMSIF/10gb5Gp7LG9wvclZFHPTXAorQyKHR0EYUgg+ffgDNbZk2BWSeuw27O1hh0Xt9SonajUt5iZgT0bIBU9wD7+z9Yi8HGaV60ENKTkMVmknf5MRljV1lc6+4Ovbv4G+/CtFeMnt3xHtljvVfFU09XHI5VIkA0EYqdgAhtr48a4dseE5ZltTb8lya4W2qi6FqKairY2eKRWXYUqmgi999tkHR0eaHHZK2qyS23m809ujq6cMiCjeR+gFWB6mYAMNHQAUd/f244sDWW1vu8VRfbhbN/vUoRt/cMoP43+eTLxQpdLPX2+TulVTyQn/AKUgfnXM9yCgyy3ZrV3fG6GOtiqIgvTI6BV9KgjTMp36B3/vifFbvks88aX/AB40miCZ4qiNl2D/AIhiRzM6hp0+Gc/1Hw7xqQb39BErb9mUdJ/IPJtZfqSmyKgszODW1aNIqDyFAJ2fsPSeVCxX+wYvFQ2e3U1wrIzN8tvniNEBlZkBDaJPSwHkDY88O4xaMpuWd02QZVb4KN6WBoUETp0nYYDQDMd+o8YnWV4f/9k=",
                         achieved: true,
-                        unlocked: 1625607419,
+                        unlocked: faker.date.recent(10).getTime(),
                         name: "Daredevil",
                         description: "",
                         id: "ACHIEVEMENT_0460",
@@ -1125,7 +1125,7 @@
                     ],
                     rate: {
                       total: 47,
-                      achieved: 44,
+                      achieved: 2 + faker.datatype.number(45),
                     },
                   },
                 ],
diff --git a/source/plugins/steam/index.mjs b/source/plugins/steam/index.mjs
index 209eeef2601..33e0422bc6e 100644
--- a/source/plugins/steam/index.mjs
+++ b/source/plugins/steam/index.mjs
@@ -94,7 +94,6 @@ export default async function({login, q, imports, data, account}, {token, enable
     }
 
     //Results
-    console.log(JSON.stringify(result))
     return result
   }
   //Handle errors

From 941683988b4d647cdc4f7ea5642509410ed72df2 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Mar 2023 21:12:56 -0400
Subject: [PATCH 092/196] feat(plugins/community/16personalities): add plugin
 (#1402) [skip ci]

---
 .github/actions/spelling/allow.txt            |   1 +
 .../imgs/plugin_16personalities_profile.png   | Bin 0 -> 165571 bytes
 .../community/16personalities/README.md       |  12 +++
 .../community/16personalities/examples.yml    |  12 +++
 .../community/16personalities/index.mjs       |  63 +++++++++++++++
 .../community/16personalities/metadata.yml    |  56 ++++++++++++++
 .../classic/partials/16personalities.ejs      |  72 ++++++++++++++++++
 source/templates/classic/partials/_.json      |   1 +
 tests/secrets.json                            |   3 +-
 9 files changed, 219 insertions(+), 1 deletion(-)
 create mode 100644 .github/readme/imgs/plugin_16personalities_profile.png
 create mode 100644 source/plugins/community/16personalities/README.md
 create mode 100644 source/plugins/community/16personalities/examples.yml
 create mode 100644 source/plugins/community/16personalities/index.mjs
 create mode 100644 source/plugins/community/16personalities/metadata.yml
 create mode 100644 source/templates/classic/partials/16personalities.ejs

diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index dfdbd479d68..f5742471cc9 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -12,6 +12,7 @@ https
 IPlayer
 ISteam
 leetcode
+MBTI
 Nie
 npx
 personaname
diff --git a/.github/readme/imgs/plugin_16personalities_profile.png b/.github/readme/imgs/plugin_16personalities_profile.png
new file mode 100644
index 0000000000000000000000000000000000000000..d55d3302c975d5d68c4fc77cc38213fc7b62b39d
GIT binary patch
diff --git a/source/plugins/community/16personalities/README.md b/source/plugins/community/16personalities/README.md
new file mode 100644
index 00000000000..3eff2a87b38
--- /dev/null
+++ b/source/plugins/community/16personalities/README.md
@@ -0,0 +1,12 @@
+<!--header-->
+<!--/header-->
+
+## ➡️ Available options
+
+<!--options-->
+<!--/options-->
+
+## ℹ️ Examples workflows
+
+<!--examples-->
+<!--/examples-->
diff --git a/source/plugins/community/16personalities/examples.yml b/source/plugins/community/16personalities/examples.yml
new file mode 100644
index 00000000000..d395dbf7e32
--- /dev/null
+++ b/source/plugins/community/16personalities/examples.yml
@@ -0,0 +1,12 @@
+- name: MBTI Personality profile
+  uses: lowlighter/metrics@latest
+  with:
+    filename: metrics.plugin.16personalities.svg
+    token: ${{ secrets.METRICS_TOKEN }}
+    base: ""
+    plugin_16personalities: yes
+    plugin_16personalities_url: ${{ secrets.SIXTEEN_PERSONALITIES_URL }}
+    plugin_16personalities_sections: personality, traits
+    plugin_16personalities_scores: no
+  test:
+    modes: []
\ No newline at end of file
diff --git a/source/plugins/community/16personalities/index.mjs b/source/plugins/community/16personalities/index.mjs
new file mode 100644
index 00000000000..e5cffc91e8e
--- /dev/null
+++ b/source/plugins/community/16personalities/index.mjs
@@ -0,0 +1,63 @@
+//Setup
+export default async function({login, q, imports, data, account}, {enabled = false, extras = false} = {}) {
+  //Plugin execution
+  try {
+    //Check if plugin is enabled and requirements are met
+    if ((!q["16personalities"]) || (!imports.metadata.plugins["16personalities"].enabled(enabled, {extras})))
+      return null
+
+    //Load inputs
+    let {url, sections, scores} = imports.metadata.plugins["16personalities"].inputs({data, account, q})
+    if (!url)
+      throw {error: {message: "URL is not set"}}
+
+    //Start puppeteer and navigate to page
+    console.debug(`metrics/compute/${login}/plugins > 16personalities > starting browser`)
+    const browser = await imports.puppeteer.launch()
+    console.debug(`metrics/compute/${login}/plugins > 16personalities > started ${await browser.version()}`)
+    const page = await browser.newPage()
+    console.debug(`metrics/compute/${login}/plugins > 16personalities > loading ${url}`)
+    await page.goto(url, {waitUntil: imports.puppeteer.events})
+
+    //Fetch raw data
+    const raw = await page.evaluate(() => ({
+      color:getComputedStyle(document.querySelector(".card__bg")).backgroundColor, //eslint-disable-line no-undef
+      type:document.querySelector(".type__code").innerText,
+      personality:[...document.querySelectorAll(".personality-cards .sp-personality-card")].map(card => ({
+        category:card.querySelector(".card__title").innerText,
+        value:card.querySelector(".card__subtitle").innerText,
+        image:card.querySelector(".card__image").src,
+        text:card.querySelector(".card__text").innerText
+      })),
+      traits:[...document.querySelectorAll("#traits .card__body")].map(card => ({
+        category:card.querySelector(".card__title").innerText,
+        value:card.querySelector(".card__subtitle").innerText,
+        score:card.querySelector(".center__num").innerText,
+        text:card.querySelector("p").innerText
+      }))
+    }))
+
+    //Format data
+    const {color} = raw
+    const type = raw.type.replace("(", "").replace(")", "").trim()
+    const personality = await Promise.all(raw.personality.map(async ({category, value, image, text}) => ({
+      category,
+      value:value.replace(`(${type})`, "").trim(),
+      image:await imports.imgb64(image),
+      text:text.replace(`${category}\n${value}\n`, "").trim()
+    })))
+    const traits = raw.traits.map(({category, value, score, text}) => ({
+      category,
+      value:`${value[0]}${value.substring(1).toLocaleLowerCase()}`,
+      score:scores ? Number(score.replace("%", ""))/100 : NaN,
+      text:text.split(".").slice(1).join("."),
+    }))
+
+    //Results
+    return {sections, color, type, personality, traits}
+  }
+  //Handle errors
+  catch (error) {
+    throw imports.format.error(error)
+  }
+}
\ No newline at end of file
diff --git a/source/plugins/community/16personalities/metadata.yml b/source/plugins/community/16personalities/metadata.yml
new file mode 100644
index 00000000000..89e8d39f78f
--- /dev/null
+++ b/source/plugins/community/16personalities/metadata.yml
@@ -0,0 +1,56 @@
+name: 🧠 16personalities
+category: community
+description: |
+  This plugin displays personality profile from a [16personalities profile](https://www.16personalities.com/profile).
+disclaimer: |
+  This plugin is not affiliated, associated, authorized, endorsed by, or in any way officially connected with [16personalities](https://www.16personalities.com).
+  All product and company names are trademarks™ or registered® trademarks of their respective holders.
+examples:
+  default: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.16personalities.svg
+authors:
+  - lowlighter
+supports:
+  - user
+scopes: []
+inputs:
+
+  plugin_16personalities:
+    description: |
+      Enable 16personalities plugin
+    type: boolean
+    default: no
+
+  plugin_16personalities_url:
+    description: |
+      Profile URL
+
+      This can be obtained after doing the [test on 16personalities](https://www.16personalities.com/free-personality-test) and registering an email.
+      Login with the generated password received in your mailbox and copy the link that is displayed when sharing the profile.
+
+      <img src="/.github/readme/imgs/plugin_16personalities_profile.png" width="800" />
+
+    type: string
+    default: ""
+    example: https://www.16personalities.com/profiles/xxxxxxxxxxxxx
+
+  plugin_16personalities_sections:
+    description: |
+      Displayed sections
+
+      - `personality` will display personality type
+      - `profile` will display role and strategy
+      - `traits` will display mind, energy, nature, tactics and identity traits
+    type: array
+    format: comma-separated
+    default: personality
+    example: personality, profile, traits
+    values:
+      - personality
+      - profile
+      - traits
+
+  plugin_16personalities_scores:
+    description: |
+      Display traits scores
+    type: boolean
+    default: yes
\ No newline at end of file
diff --git a/source/templates/classic/partials/16personalities.ejs b/source/templates/classic/partials/16personalities.ejs
new file mode 100644
index 00000000000..48883f7959e
--- /dev/null
+++ b/source/templates/classic/partials/16personalities.ejs
@@ -0,0 +1,72 @@
+<% if (plugins["16personalities"]) { %>
+  <section>
+    <h2 class="field">
+      <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M5.5 4.25a2.25 2.25 0 0 1 4.5 0 .75.75 0 0 0 1.5 0 3.75 3.75 0 1 0-6.14 2.889l-2.272 4.258a.75.75 0 0 0 1.324.706L7 7.25a.75.75 0 0 0-.309-1.015A2.25 2.25 0 0 1 5.5 4.25Z"></path><path d="M7.364 3.607a.75.75 0 0 1 1.03.257l2.608 4.349a3.75 3.75 0 1 1-.628 6.785.75.75 0 0 1 .752-1.299 2.25 2.25 0 1 0-.033-3.88.75.75 0 0 1-1.03-.256L7.107 4.636a.75.75 0 0 1 .257-1.03Z"></path><path d="M2.9 8.776A.75.75 0 0 1 2.625 9.8 2.25 2.25 0 1 0 6 11.75a.75.75 0 0 1 .75-.751h5.5a.75.75 0 0 1 0 1.5H7.425a3.751 3.751 0 1 1-5.55-3.998.75.75 0 0 1 1.024.274Z"></path></svg>
+      <%= !plugins["16personalities"].error ? `${plugins["16personalities"].type} personality` : "Personality" %> <sub style="font-style: italic; margin-left: 4px; margin-top: -6px; font-size: 12px;">(results from 16personalities)</sub>
+    </h2>
+    <% if (plugins["16personalities"].error) { %>
+      <div class="row">
+        <section>
+          <div class="field error">
+            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M2.343 13.657A8 8 0 1113.657 2.343 8 8 0 012.343 13.657zM6.03 4.97a.75.75 0 00-1.06 1.06L6.94 8 4.97 9.97a.75.75 0 101.06 1.06L8 9.06l1.97 1.97a.75.75 0 101.06-1.06L9.06 8l1.97-1.97a.75.75 0 10-1.06-1.06L8 6.94 6.03 4.97z"></path></svg>
+            <%= plugins["16personalities"].error.message %>
+          </div>
+        </section>
+      </div>
+    <% } else { %>
+      <% if ((plugins["16personalities"].sections.includes("personality"))||(plugins["16personalities"].sections.includes("profile"))) { %>
+        <div class="row fill-width">
+          <section class="personality-traits categories">
+            <% for (const {category, value, image, text} of plugins["16personalities"].personality) { if (((!plugins["16personalities"].sections.includes("personality"))&&(/personality/i.test(category)))||((!plugins["16personalities"].sections.includes("profile"))&&(!/personality/i.test(category)))) continue %>
+              <div class="category">
+                <img src="<%= image %>" alt="" />
+                <div class="explanation">
+                  <span class="title" style="color: <%= plugins["16personalities"].color %>;"><span class="subtitle"><%= value %></span> <%= category.toLocaleLowerCase() %></span>
+                  <span class="text"><%= text %></span>
+                </div>
+              </div>
+            <% } %>
+          </section>
+        </div>
+      <% } %>
+      <% if (plugins["16personalities"].sections.includes("traits")) { %>
+        <div class="row fill-width">
+          <section class="personality-traits categories">
+            <% for (const {category, value, score, text} of plugins["16personalities"].traits) { %>
+              <div class="category <%= category.toLocaleLowerCase() %>">
+                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 120" width="50" height="50" class="gauge">
+                <circle class="gauge-base" r="53" cx="60" cy="60"></circle>
+                <% if (!Number.isNaN(score)) { %>
+                  <circle class="gauge-arc" transform="rotate(-90 60 60)" r="53" cx="60" cy="60" stroke-dasharray="<%= score * 329 %> 329"></circle>
+                  <text x="60" y="60" dominant-baseline="central" ><%= Math.round(score*100) %></text>
+                <% } else { %>
+                  <circle class="gauge-arc" transform="rotate(-90 60 60)" r="53" cx="60" cy="60" stroke-dasharray="329 329"></circle>
+                  <text x="60" y="60" dominant-baseline="central" ><%= (/energy/i.test(category))&&(/intuitive/i.test(value)) ? "N" : value.charAt(0) %></text>
+                <% } %>
+                </svg>
+                <div class="explanation">
+                  <span class="title"><span class="subtitle"><%= value %></span> <%= category.toLocaleLowerCase() %></span>
+                  <span class="text"><%= text %></span>
+                </div>
+              </div>
+            <% } %>
+          </section>
+        </div>
+      <% } %>
+      <style>
+        .personality-traits { flex-direction: column; }
+        .personality-traits .category { flex-direction: row; }
+        .personality-traits .category .gauge, .personality-traits .category img { flex-shrink: 0; margin: 5px 9px; }
+        .personality-traits .category .explanation { display: flex; flex-direction: column; }
+        .personality-traits .category .subtitle { text-transform: uppercase; font-weight: bold; }
+        .personality-traits .category img { width: 50px; }
+        .mind .gauge, .mind .title { color: #4298b4; }
+        .energy .gauge, .energy .title { color: #e4ae3a; }
+        .nature .gauge, .nature .title { color: #33a474; }
+        .tactics .gauge, .tactics .title { color: #88619a; }
+        .identity .gauge, .identity .title { color: #f25e62; }
+        .text { font-size: 12px; color: #777; }
+      </style>
+    <% } %>
+  </section>
+<% } %>
\ No newline at end of file
diff --git a/source/templates/classic/partials/_.json b/source/templates/classic/partials/_.json
index a7886e43ae6..dcc317eb823 100644
--- a/source/templates/classic/partials/_.json
+++ b/source/templates/classic/partials/_.json
@@ -41,6 +41,7 @@
   "sponsors",
   "sponsorships",
   "poopmap",
+  "16personalities",
   "fortune",
   "splatoon",
   "steam"
diff --git a/tests/secrets.json b/tests/secrets.json
index 809c6094b83..04d55bb6c81 100644
--- a/tests/secrets.json
+++ b/tests/secrets.json
@@ -15,5 +15,6 @@
   "STEAM_TOKEN":"MOCKED_TOKEN",
   "SPLATOON_TOKEN":"{}",
   "SPLATOON_STATINK_TOKEN":"MOCKED_TOKEN",
-  "POOPMAP_TOKEN":"MOCKED_TOKEN"
+  "POOPMAP_TOKEN":"MOCKED_TOKEN",
+  "SIXTEEN_PERSONALITIES_URL":"https://www.16personalities.com/profiles/xxxxxxxxxxxxx"
 }
\ No newline at end of file

From 05e244b3fcec22d2aaa33eca8adad070e218ee0c Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Mar 2023 21:16:10 -0400
Subject: [PATCH 093/196] fix(plugins/traffic): display scope errors

---
 source/plugins/traffic/index.mjs | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/source/plugins/traffic/index.mjs b/source/plugins/traffic/index.mjs
index 12563e35972..e5b3a77561f 100644
--- a/source/plugins/traffic/index.mjs
+++ b/source/plugins/traffic/index.mjs
@@ -16,7 +16,15 @@ export default async function({login, imports, data, rest, q, account}, {enabled
     //Get views stats from repositories
     console.debug(`metrics/compute/${login}/plugins > traffic > querying api`)
     const views = {count: 0, uniques: 0}
-    const response = [...await Promise.allSettled(repositories.map(({repo, owner}) => imports.filters.repo(`${owner}/${repo}`, skipped) ? rest.repos.getViews({owner, repo}) : {}))].filter(({status}) => status === "fulfilled").map(({value}) => value)
+    const promised = [...await Promise.allSettled(repositories.map(({repo, owner}) => imports.filters.repo(`${owner}/${repo}`, skipped) ? rest.repos.getViews({owner, repo}) : {}))]
+    const response = promised.filter(({status}) => status === "fulfilled").map(({value}) => value)
+
+    //Handle error if all promises were rejected
+    if (promised.filter(({status}) => status === "rejected").length === promised.length) {
+      if (promised.map(({reason}) => reason.message).every(error => /must have push access to repository/i.test(error)))
+        throw {error: {message: "Insufficient token scopes"}}
+      throw new Error(promised[0].reason.message)
+    }
 
     //Compute views
     console.debug(`metrics/compute/${login}/plugins > traffic > computing stats`)

From 10885a11d97bb7b2888545d536c541cd5b29cf63 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Mar 2023 21:22:13 -0400
Subject: [PATCH 094/196] chore: generate test cases

---
 .github/workflows/examples.yml                | 47 +++++++++++++++++++
 .../community/16personalities/metadata.yml    |  2 +
 tests/cases/16personalities.plugin.yml        | 11 +++++
 tests/cases/steam.plugin.yml                  | 20 ++++++++
 4 files changed, 80 insertions(+)
 create mode 100644 tests/cases/16personalities.plugin.yml
 create mode 100644 tests/cases/steam.plugin.yml

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 0233f9f93b9..b0151b624fe 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -1122,6 +1122,53 @@ jobs:
           user: lowlighter
           plugins_errors_fatal: yes
         if: ${{ success() || failure() }}
+      - name: 🕹️ Steam - Recently played games
+        uses: lowlighter/metrics@master
+        with:
+          filename: metrics.plugin.steam.svg
+          token: NOT_NEEDED
+          base: ""
+          plugin_steam_token: MOCKED_TOKEN
+          plugin_steam: yes
+          plugin_steam_user: 0
+          plugin_steam_sections: recently-played
+          plugin_steam_achievements_limit: 0
+          use_mocked_data: yes
+          output_action: none
+          delay: 120
+          user: lowlighter
+          plugins_errors_fatal: yes
+        if: ${{ success() || failure() }}
+      - name: 🕹️ Steam - Profile and detailed game history
+        uses: lowlighter/metrics@master
+        with:
+          filename: metrics.plugin.steam.full.svg
+          token: NOT_NEEDED
+          base: ""
+          plugin_steam_token: MOCKED_TOKEN
+          plugin_steam: yes
+          plugin_steam_user: 0
+          use_mocked_data: yes
+          output_action: none
+          delay: 120
+          user: lowlighter
+          plugins_errors_fatal: yes
+        if: ${{ success() || failure() }}
+      - name: 🧠 16personalities - MBTI Personality profile
+        uses: lowlighter/metrics@master
+        with:
+          filename: metrics.plugin.16personalities.svg
+          token: ${{ secrets.METRICS_TOKEN }}
+          base: ""
+          plugin_16personalities: yes
+          plugin_16personalities_url: ${{ secrets.SIXTEEN_PERSONALITIES_URL }}
+          plugin_16personalities_sections: personality, traits
+          plugin_16personalities_scores: no
+          output_action: none
+          delay: 120
+          user: lowlighter
+          plugins_errors_fatal: yes
+        if: ${{ success() || failure() }}
       - name: ♟️ Chess - Last chess game from lichess.org
         uses: lowlighter/metrics@master
         with:
diff --git a/source/plugins/community/16personalities/metadata.yml b/source/plugins/community/16personalities/metadata.yml
index 89e8d39f78f..9f112005cf8 100644
--- a/source/plugins/community/16personalities/metadata.yml
+++ b/source/plugins/community/16personalities/metadata.yml
@@ -19,6 +19,8 @@ inputs:
       Enable 16personalities plugin
     type: boolean
     default: no
+    extras:
+      - metrics.run.puppeteer.scrapping
 
   plugin_16personalities_url:
     description: |
diff --git a/tests/cases/16personalities.plugin.yml b/tests/cases/16personalities.plugin.yml
new file mode 100644
index 00000000000..4ea46405c00
--- /dev/null
+++ b/tests/cases/16personalities.plugin.yml
@@ -0,0 +1,11 @@
+- name: 🧠 16personalities - MBTI Personality profile
+  uses: lowlighter/metrics@latest
+  with:
+    token: MOCKED_TOKEN
+    plugin_16personalities: 'yes'
+    plugin_16personalities_url: https://www.16personalities.com/profiles/xxxxxxxxxxxxx
+    plugin_16personalities_sections: personality, traits
+    plugin_16personalities_scores: 'no'
+    use_mocked_data: 'yes'
+    verify: 'yes'
+  modes: []
diff --git a/tests/cases/steam.plugin.yml b/tests/cases/steam.plugin.yml
new file mode 100644
index 00000000000..7062aaf09da
--- /dev/null
+++ b/tests/cases/steam.plugin.yml
@@ -0,0 +1,20 @@
+- name: 🕹️ Steam - Recently played games
+  uses: lowlighter/metrics@latest
+  with:
+    token: NOT_NEEDED
+    plugin_steam_token: MOCKED_TOKEN
+    plugin_steam: 'yes'
+    plugin_steam_user: 0
+    plugin_steam_sections: recently-played
+    plugin_steam_achievements_limit: 0
+    use_mocked_data: 'yes'
+    verify: 'yes'
+- name: 🕹️ Steam - Profile and detailed game history
+  uses: lowlighter/metrics@latest
+  with:
+    token: NOT_NEEDED
+    plugin_steam_token: MOCKED_TOKEN
+    plugin_steam: 'yes'
+    plugin_steam_user: 0
+    use_mocked_data: 'yes'
+    verify: 'yes'

From 40956a5972e0ee5663b4d159bd70a009449443e3 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Mar 2023 22:15:57 -0400
Subject: [PATCH 095/196] fix(plugins/traffic): warn rejected requests

---
 source/plugins/traffic/index.mjs | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/source/plugins/traffic/index.mjs b/source/plugins/traffic/index.mjs
index e5b3a77561f..da19cbc383e 100644
--- a/source/plugins/traffic/index.mjs
+++ b/source/plugins/traffic/index.mjs
@@ -20,11 +20,15 @@ export default async function({login, imports, data, rest, q, account}, {enabled
     const response = promised.filter(({status}) => status === "fulfilled").map(({value}) => value)
 
     //Handle error if all promises were rejected
-    if (promised.filter(({status}) => status === "rejected").length === promised.length) {
+    const rejected = promised.filter(({status}) => status === "rejected")
+    if (rejected.length === promised.length) {
       if (promised.map(({reason}) => reason.message).every(error => /must have push access to repository/i.test(error)))
         throw {error: {message: "Insufficient token scopes"}}
       throw new Error(promised[0].reason.message)
     }
+    else if (rejected.length) {
+      rejected.map(({reason}) => console.debug(`metrics/compute/${login}/plugins > traffic > warn > ${reason.message}`))
+    }
 
     //Compute views
     console.debug(`metrics/compute/${login}/plugins > traffic > computing stats`)

From 8dbeb515cbf688170311ce708e80009b89b6658f Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Mar 2023 22:16:12 -0400
Subject: [PATCH 096/196] fix(ci): use placeholder url

---
 source/plugins/community/16personalities/examples.yml | 2 --
 tests/cases/16personalities.plugin.yml                | 3 +--
 tests/secrets.json                                    | 2 +-
 3 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/source/plugins/community/16personalities/examples.yml b/source/plugins/community/16personalities/examples.yml
index d395dbf7e32..ec3868ba013 100644
--- a/source/plugins/community/16personalities/examples.yml
+++ b/source/plugins/community/16personalities/examples.yml
@@ -8,5 +8,3 @@
     plugin_16personalities_url: ${{ secrets.SIXTEEN_PERSONALITIES_URL }}
     plugin_16personalities_sections: personality, traits
     plugin_16personalities_scores: no
-  test:
-    modes: []
\ No newline at end of file
diff --git a/tests/cases/16personalities.plugin.yml b/tests/cases/16personalities.plugin.yml
index 4ea46405c00..4a010ccfa4d 100644
--- a/tests/cases/16personalities.plugin.yml
+++ b/tests/cases/16personalities.plugin.yml
@@ -3,9 +3,8 @@
   with:
     token: MOCKED_TOKEN
     plugin_16personalities: 'yes'
-    plugin_16personalities_url: https://www.16personalities.com/profiles/xxxxxxxxxxxxx
+    plugin_16personalities_url: https://www.16personalities.com/profiles/b7d9f29453ea5
     plugin_16personalities_sections: personality, traits
     plugin_16personalities_scores: 'no'
     use_mocked_data: 'yes'
     verify: 'yes'
-  modes: []
diff --git a/tests/secrets.json b/tests/secrets.json
index 04d55bb6c81..308e2edd472 100644
--- a/tests/secrets.json
+++ b/tests/secrets.json
@@ -16,5 +16,5 @@
   "SPLATOON_TOKEN":"{}",
   "SPLATOON_STATINK_TOKEN":"MOCKED_TOKEN",
   "POOPMAP_TOKEN":"MOCKED_TOKEN",
-  "SIXTEEN_PERSONALITIES_URL":"https://www.16personalities.com/profiles/xxxxxxxxxxxxx"
+  "SIXTEEN_PERSONALITIES_URL":"https://www.16personalities.com/profiles/b7d9f29453ea5"
 }
\ No newline at end of file

From 6b04b360389645e4189aac01d7e4f88a82b790a9 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 14 Mar 2023 02:54:23 +0000
Subject: [PATCH 097/196] chore: code formatting

---
 .../community/16personalities/index.mjs       | 40 +++++++++----------
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/source/plugins/community/16personalities/index.mjs b/source/plugins/community/16personalities/index.mjs
index e5cffc91e8e..92d8fb28a21 100644
--- a/source/plugins/community/16personalities/index.mjs
+++ b/source/plugins/community/16personalities/index.mjs
@@ -21,20 +21,20 @@ export default async function({login, q, imports, data, account}, {enabled = fal
 
     //Fetch raw data
     const raw = await page.evaluate(() => ({
-      color:getComputedStyle(document.querySelector(".card__bg")).backgroundColor, //eslint-disable-line no-undef
-      type:document.querySelector(".type__code").innerText,
-      personality:[...document.querySelectorAll(".personality-cards .sp-personality-card")].map(card => ({
-        category:card.querySelector(".card__title").innerText,
-        value:card.querySelector(".card__subtitle").innerText,
-        image:card.querySelector(".card__image").src,
-        text:card.querySelector(".card__text").innerText
+      color: getComputedStyle(document.querySelector(".card__bg")).backgroundColor, //eslint-disable-line no-undef
+      type: document.querySelector(".type__code").innerText,
+      personality: [...document.querySelectorAll(".personality-cards .sp-personality-card")].map(card => ({
+        category: card.querySelector(".card__title").innerText,
+        value: card.querySelector(".card__subtitle").innerText,
+        image: card.querySelector(".card__image").src,
+        text: card.querySelector(".card__text").innerText,
+      })),
+      traits: [...document.querySelectorAll("#traits .card__body")].map(card => ({
+        category: card.querySelector(".card__title").innerText,
+        value: card.querySelector(".card__subtitle").innerText,
+        score: card.querySelector(".center__num").innerText,
+        text: card.querySelector("p").innerText,
       })),
-      traits:[...document.querySelectorAll("#traits .card__body")].map(card => ({
-        category:card.querySelector(".card__title").innerText,
-        value:card.querySelector(".card__subtitle").innerText,
-        score:card.querySelector(".center__num").innerText,
-        text:card.querySelector("p").innerText
-      }))
     }))
 
     //Format data
@@ -42,15 +42,15 @@ export default async function({login, q, imports, data, account}, {enabled = fal
     const type = raw.type.replace("(", "").replace(")", "").trim()
     const personality = await Promise.all(raw.personality.map(async ({category, value, image, text}) => ({
       category,
-      value:value.replace(`(${type})`, "").trim(),
-      image:await imports.imgb64(image),
-      text:text.replace(`${category}\n${value}\n`, "").trim()
+      value: value.replace(`(${type})`, "").trim(),
+      image: await imports.imgb64(image),
+      text: text.replace(`${category}\n${value}\n`, "").trim(),
     })))
     const traits = raw.traits.map(({category, value, score, text}) => ({
       category,
-      value:`${value[0]}${value.substring(1).toLocaleLowerCase()}`,
-      score:scores ? Number(score.replace("%", ""))/100 : NaN,
-      text:text.split(".").slice(1).join("."),
+      value: `${value[0]}${value.substring(1).toLocaleLowerCase()}`,
+      score: scores ? Number(score.replace("%", "")) / 100 : NaN,
+      text: text.split(".").slice(1).join("."),
     }))
 
     //Results
@@ -60,4 +60,4 @@ export default async function({login, q, imports, data, account}, {enabled = fal
   catch (error) {
     throw imports.format.error(error)
   }
-}
\ No newline at end of file
+}

From ddf66d31a52cdcb5172f8b45a37071282a9fc9ed Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 14 Mar 2023 02:55:35 +0000
Subject: [PATCH 098/196] ci: auto-regenerate files

---
 .../partials/documentation/compatibility.md   |  11 +-
 README.md                                     |  36 +++-
 action.yml                                    |  57 ++++++
 settings.example.json                         |   7 +
 source/plugins/README.md                      |   2 +
 .../community/16personalities/README.md       | 101 ++++++++++
 source/plugins/community/README.md            |  25 +--
 source/plugins/steam/README.md                | 178 ++++++++++++++++++
 source/templates/classic/README.md            |   2 +-
 9 files changed, 397 insertions(+), 22 deletions(-)

diff --git a/.github/readme/partials/documentation/compatibility.md b/.github/readme/partials/documentation/compatibility.md
index 3923c6c5668..da009dfa73d 100644
--- a/.github/readme/partials/documentation/compatibility.md
+++ b/.github/readme/partials/documentation/compatibility.md
@@ -41,6 +41,7 @@
     <th nowrap="nowrap" align="center" title="🗼 Rss feed">🗼</th>
     <th nowrap="nowrap" align="center" title="⏰ WakaTime">⏰</th>
     <th nowrap="nowrap" align="center" title="🗳️ Leetcode">🗳️</th>
+    <th nowrap="nowrap" align="center" title="🕹️ Steam">🕹️</th>
   </tr>  
   <tr>
     <td nowrap="nowrap">📗 Classic template</td>    
@@ -82,6 +83,7 @@
     <td nowrap="nowrap" align="center" data-plugin="rss">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="wakatime">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="leetcode">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="steam">✔️</td>
   </tr>
   <tr>
     <td nowrap="nowrap">📘 Repository template</td>    
@@ -123,6 +125,7 @@
     <td nowrap="nowrap" align="center" data-plugin="rss">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="wakatime">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="leetcode">❌</td>
+    <td nowrap="nowrap" align="center" data-plugin="steam">❌</td>
   </tr>
   <tr>
     <td nowrap="nowrap">📙 Terminal template</td>    
@@ -164,6 +167,7 @@
     <td nowrap="nowrap" align="center" data-plugin="rss">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="wakatime">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="leetcode">❌</td>
+    <td nowrap="nowrap" align="center" data-plugin="steam">❌</td>
   </tr>
   <tr>
     <td nowrap="nowrap">📒 Markdown template</td>    
@@ -205,9 +209,10 @@
     <td nowrap="nowrap" align="center" data-plugin="rss">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="wakatime">✓</td>
     <td nowrap="nowrap" align="center" data-plugin="leetcode">✓</td>
+    <td nowrap="nowrap" align="center" data-plugin="steam">✓</td>
   </tr>
   <tr>
-    <td colspan="38"></td>
+    <td colspan="39"></td>
   </tr>
   <tr>
     <th nowrap="nowrap">Mode/Plugin</th>    
@@ -249,6 +254,7 @@
     <th nowrap="nowrap" align="center" title="🗼 Rss feed">🗼</th>
     <th nowrap="nowrap" align="center" title="⏰ WakaTime">⏰</th>
     <th nowrap="nowrap" align="center" title="🗳️ Leetcode">🗳️</th>
+    <th nowrap="nowrap" align="center" title="🕹️ Steam">🕹️</th>
   </tr>  
   <tr>
     <td nowrap="nowrap">👤 User</td>    
@@ -290,6 +296,7 @@
     <td nowrap="nowrap" align="center" data-plugin="rss">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="wakatime">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="leetcode">✔️</td>
+    <td nowrap="nowrap" align="center" data-plugin="steam">✔️</td>
   </tr>
   <tr>
     <td nowrap="nowrap">👥 Organization</td>    
@@ -331,6 +338,7 @@
     <td nowrap="nowrap" align="center" data-plugin="rss">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="wakatime">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="leetcode">❌</td>
+    <td nowrap="nowrap" align="center" data-plugin="steam">✔️</td>
   </tr>
   <tr>
     <td nowrap="nowrap">📓 Repository</td>    
@@ -372,6 +380,7 @@
     <td nowrap="nowrap" align="center" data-plugin="rss">✔️</td>
     <td nowrap="nowrap" align="center" data-plugin="wakatime">❌</td>
     <td nowrap="nowrap" align="center" data-plugin="leetcode">❌</td>
+    <td nowrap="nowrap" align="center" data-plugin="steam">❌</td>
   </tr>
 </table>
 
diff --git a/README.md b/README.md
index 74b6e71c501..d68554e4fa8 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
   </tr>
   <tr>
     <th colspan="2" align="center">
-      <h3><a href="/README.md#-plugins">🧩 Customizable with 44 plugins and 314 options!</a></h3>
+      <h3><a href="/README.md#-plugins">🧩 Customizable with 46 plugins and 327 options!</a></h3>
     </th>
   </tr>
   <tr>
@@ -303,62 +303,78 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
         <img width="900" height="1" alt="">
       </td>
   </tr>
+  <tr>
+    <th><a href="source/plugins/steam/README.md">🕹️ Steam</a></th>
+    <th></th>
+  </tr>
+  <tr>
+        <td  align="center">
+        <details open><summary>Recently played games</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.steam.svg" alt=""></img></details>
+        <details><summary>Profile and detailed game history</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.steam.full.svg" alt=""></img></details>
+        <img width="900" height="1" alt="">
+      </td>
+    <td align="center"><img width="900" height="1" alt=""></td>
+  </tr>
   <tr>
     <th colspan="2" align="center">
       <a href="/source/plugins/community/README.md">🎲 See also community plugins</a>
     </th>
   </tr>
   <tr>
+    <th><a href="source/plugins/community/16personalities/README.md">🧠 16personalities</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup>
+      <details><summary>Render example</summary>
+        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.16personalities.svg" alt=""></img>
+        <img width="900" height="1" alt="">
+      </details>
+    </th>
     <th><a href="source/plugins/community/chess/README.md">♟️ Chess</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.chess.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
+  </tr>
+  <tr>
     <th><a href="source/plugins/community/fortune/README.md">🥠 Fortune</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.fortune.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
-  </tr>
-  <tr>
     <th><a href="source/plugins/community/nightscout/README.md">💉 Nightscout</a><br><sup>by <a href="https://github.com/legoandmars">@legoandmars</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/legoandmars/legoandmars/blob/master/metrics.plugin.nightscout.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
+  </tr>
+  <tr>
     <th><a href="source/plugins/community/poopmap/README.md">💩 PoopMap plugin</a><br><sup>by <a href="https://github.com/matievisthekat">@matievisthekat</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/matievisthekat/matievisthekat/blob/master/metrics.plugin.poopmap.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
-  </tr>
-  <tr>
     <th><a href="source/plugins/community/screenshot/README.md">📸 Website screenshot</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.screenshot.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
+  </tr>
+  <tr>
     <th><a href="source/plugins/community/splatoon/README.md">🦑 Splatoon</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.splatoon.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
-  </tr>
-  <tr>
     <th><a href="source/plugins/community/stock/README.md">💹 Stock prices</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stock.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
-    <th>
-    </th>
   </tr>
   <tr>
     <th colspan="2" align="center">
@@ -515,11 +531,13 @@ Plugins provide additional content and lets you customize rendered metrics.
   * [✒️ Recent posts <sub>`posts`</sub>](/source/plugins/posts/README.md)
   * [🗼 Rss feed <sub>`rss`</sub>](/source/plugins/rss/README.md)
   * [🗨️ Stack Overflow <sub>`stackoverflow`</sub>](/source/plugins/stackoverflow/README.md)
+  * [🕹️ Steam <sub>`steam`</sub>](/source/plugins/steam/README.md)
   * [🐤 Latest tweets <sub>`tweets`</sub>](/source/plugins/tweets/README.md)
   * [⏰ WakaTime <sub>`wakatime`</sub>](/source/plugins/wakatime/README.md)
 
 **🎲 Maintained by community**
 * **[Community plugins](/source/plugins/community/README.md)**
+  * [🧠 16personalities <sub>`16personalities`</sub>](/source/plugins/community/16personalities/README.md) by [@lowlighter](https://github.com/lowlighter)
   * [♟️ Chess <sub>`chess`</sub>](/source/plugins/community/chess/README.md) by [@lowlighter](https://github.com/lowlighter)
   * [🥠 Fortune <sub>`fortune`</sub>](/source/plugins/community/fortune/README.md) by [@lowlighter](https://github.com/lowlighter)
   * [💉 Nightscout <sub>`nightscout`</sub>](/source/plugins/community/nightscout/README.md) by [@legoandmars](https://github.com/legoandmars)
diff --git a/action.yml b/action.yml
index 64976d2042c..7026ff9bc24 100644
--- a/action.yml
+++ b/action.yml
@@ -1230,6 +1230,63 @@ inputs:
     description: Display limit (recent)
     default: <default-value>
 
+  # ====================================================================================
+  # 🕹️ Steam
+
+  plugin_steam:
+    description: Enable steam plugin
+    default: <default-value>
+
+  plugin_steam_token:
+    description: Steam token
+    default: <default-value>
+
+  plugin_steam_sections:
+    description: Displayed sections
+    default: <default-value>
+
+  plugin_steam_user:
+    description: Steam user id
+
+  plugin_steam_games_ignored:
+    description: Ignored games
+    default: <default-value>
+
+  plugin_steam_games_limit:
+    description: Display limit (Most played games)
+    default: <default-value>
+
+  plugin_steam_recent_games_limit:
+    description: Display limit (Recently played games)
+    default: <default-value>
+
+  plugin_steam_achievements_limit:
+    description: Display limit (Games achievements)
+    default: <default-value>
+
+  plugin_steam_playtime_threshold:
+    description: Display threshold (Game playtime in hours)
+    default: <default-value>
+
+  # ====================================================================================
+  # 🧠 16personalities
+
+  plugin_16personalities:
+    description: Enable 16personalities plugin
+    default: <default-value>
+
+  plugin_16personalities_url:
+    description: Profile URL
+    default: <default-value>
+
+  plugin_16personalities_sections:
+    description: Displayed sections
+    default: <default-value>
+
+  plugin_16personalities_scores:
+    description: Display traits scores
+    default: <default-value>
+
   # ====================================================================================
   # ♟️ Chess
 
diff --git a/settings.example.json b/settings.example.json
index b106ec69dc4..c329ef1444e 100644
--- a/settings.example.json
+++ b/settings.example.json
@@ -180,6 +180,13 @@
     "leetcode":{
       "enabled": false,                 "//": "Enable leetcode plugin"
     },
+    "steam":{
+      "token": "Steam token",
+      "enabled": false,                 "//": "Enable steam plugin"
+    },
+    "16personalities":{
+      "enabled": false,                 "//": "Enable 16personalities plugin"
+    },
     "chess":{
       "token": "Chess platform token",
       "enabled": false,                 "//": "Enable chess plugin"
diff --git a/source/plugins/README.md b/source/plugins/README.md
index e34fa9b4c10..d7b7345d7a9 100644
--- a/source/plugins/README.md
+++ b/source/plugins/README.md
@@ -44,11 +44,13 @@ Plugins provide additional content and lets you customize rendered metrics.
   * [✒️ Recent posts <sub>`posts`</sub>](/source/plugins/posts/README.md)
   * [🗼 Rss feed <sub>`rss`</sub>](/source/plugins/rss/README.md)
   * [🗨️ Stack Overflow <sub>`stackoverflow`</sub>](/source/plugins/stackoverflow/README.md)
+  * [🕹️ Steam <sub>`steam`</sub>](/source/plugins/steam/README.md)
   * [🐤 Latest tweets <sub>`tweets`</sub>](/source/plugins/tweets/README.md)
   * [⏰ WakaTime <sub>`wakatime`</sub>](/source/plugins/wakatime/README.md)
 
 **🎲 Maintained by community**
 * **[Community plugins](/source/plugins/community/README.md)**
+  * [🧠 16personalities <sub>`16personalities`</sub>](/source/plugins/community/16personalities/README.md) by [@lowlighter](https://github.com/lowlighter)
   * [♟️ Chess <sub>`chess`</sub>](/source/plugins/community/chess/README.md) by [@lowlighter](https://github.com/lowlighter)
   * [🥠 Fortune <sub>`fortune`</sub>](/source/plugins/community/fortune/README.md) by [@lowlighter](https://github.com/lowlighter)
   * [💉 Nightscout <sub>`nightscout`</sub>](/source/plugins/community/nightscout/README.md) by [@legoandmars](https://github.com/legoandmars)
diff --git a/source/plugins/community/16personalities/README.md b/source/plugins/community/16personalities/README.md
index 3eff2a87b38..734953cc1a8 100644
--- a/source/plugins/community/16personalities/README.md
+++ b/source/plugins/community/16personalities/README.md
@@ -1,12 +1,113 @@
 <!--header-->
+<table>
+  <tr><td colspan="2"><a href="/README.md#-plugins">← Back to plugins index</a></td></tr>
+  <tr><th colspan="2"><h3>🧠 16personalities</h3></th></tr>
+  <tr><td colspan="2" align="center"><p>This plugin displays personality profile from a <a href="https://www.16personalities.com/profile">16personalities profile</a>.</p>
+</td></tr>
+  <tr><th>⚠️ Disclaimer</th><td><p>This plugin is not affiliated, associated, authorized, endorsed by, or in any way officially connected with <a href="https://www.16personalities.com">16personalities</a>.
+All product and company names are trademarks™ or registered® trademarks of their respective holders.</p>
+</td></tr>
+<tr><th>Authors</th><td><a href="https://github.com/lowlighter">@lowlighter</a></td></tr>
+  <tr>
+    <th rowspan="3">Supported features<br><sub><a href="metadata.yml">→ Full specification</a></sub></th>
+    <td><a href="/source/templates/classic/README.md"><code>📗 Classic template</code></a></td>
+  </tr>
+  <tr>
+    <td><code>👤 Users</code></td>
+  </tr>
+  <tr>
+    <td><i>No tokens are required for this plugin</i></td>
+  </tr>
+  <tr>
+    <td colspan="2" align="center">
+      <img src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.16personalities.svg" alt=""></img>
+      <img width="900" height="1" alt="">
+    </td>
+  </tr>
+</table>
 <!--/header-->
 
 ## ➡️ Available options
 
 <!--options-->
+<table>
+  <tr>
+    <td align="center" nowrap="nowrap">Option</i></td><td align="center" nowrap="nowrap">Description</td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_16personalities</code></h4></td>
+    <td rowspan="2"><p>Enable 16personalities plugin</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
+<ul>
+<li><i>metrics.run.puppeteer.scrapping</i></li>
+</ul>
+<b>type:</b> <code>boolean</code>
+<br>
+<b>default:</b> no<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_16personalities_url</code></h4></td>
+    <td rowspan="2"><p>Profile URL</p>
+<p>This can be obtained after doing the <a href="https://www.16personalities.com/free-personality-test">test on 16personalities</a> and registering an email.
+Login with the generated password received in your mailbox and copy the link that is displayed when sharing the profile.</p>
+<img src="/.github/readme/imgs/plugin_16personalities_profile.png" width="800" />
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
+<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_16personalities_sections</code></h4></td>
+    <td rowspan="2"><p>Displayed sections</p>
+<ul>
+<li><code>personality</code> will display personality type</li>
+<li><code>profile</code> will display role and strategy</li>
+<li><code>traits</code> will display mind, energy, nature, tactics and identity traits</li>
+</ul>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
+<i>(comma-separated)</i>
+<br>
+<b>default:</b> personality<br>
+<b>allowed values:</b><ul><li>personality</li><li>profile</li><li>traits</li></ul></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_16personalities_scores</code></h4></td>
+    <td rowspan="2"><p>Display traits scores</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
+<br>
+<b>default:</b> yes<br></td>
+  </tr>
+</table>
 <!--/options-->
 
 ## ℹ️ Examples workflows
 
 <!--examples-->
+```yaml
+name: MBTI Personality profile
+uses: lowlighter/metrics@latest
+with:
+  filename: metrics.plugin.16personalities.svg
+  token: ${{ secrets.METRICS_TOKEN }}
+  base: ""
+  plugin_16personalities: yes
+  plugin_16personalities_url: ${{ secrets.SIXTEEN_PERSONALITIES_URL }}
+  plugin_16personalities_sections: personality, traits
+  plugin_16personalities_scores: no
+
+```
 <!--/examples-->
diff --git a/source/plugins/community/README.md b/source/plugins/community/README.md
index 50a48e1cd99..8c64563e959 100644
--- a/source/plugins/community/README.md
+++ b/source/plugins/community/README.md
@@ -3,54 +3,57 @@
   <tr><th colspan="2"><h3>🎲 Community plugins</h3></th></tr>
   <tr><td colspan="2" align="center">Additional plugins maintained by community for even more features!</td></tr>
   <tr>
+    <th><a href="/source/plugins/community/16personalities/README.md">🧠 16personalities</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
     <th><a href="/source/plugins/community/chess/README.md">♟️ Chess</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
-    <th><a href="/source/plugins/community/fortune/README.md">🥠 Fortune</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
   </tr>
   <tr>
     <td  align="center">
-      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.chess.svg" alt=""></img>
+      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.16personalities.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
     <td  align="center">
-      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.fortune.svg" alt=""></img>
+      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.chess.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
   </tr>  <tr>
+    <th><a href="/source/plugins/community/fortune/README.md">🥠 Fortune</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
     <th><a href="/source/plugins/community/nightscout/README.md">💉 Nightscout</a><br><sup>by <a href="https://github.com/legoandmars">@legoandmars</a></sup></th>
-    <th><a href="/source/plugins/community/poopmap/README.md">💩 PoopMap plugin</a><br><sup>by <a href="https://github.com/matievisthekat">@matievisthekat</a></sup></th>
   </tr>
   <tr>
     <td  align="center">
-      <img alt="" width="400" src="https://github.com/legoandmars/legoandmars/blob/master/metrics.plugin.nightscout.svg" alt=""></img>
+      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.fortune.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
     <td  align="center">
-      <img alt="" width="400" src="https://github.com/matievisthekat/matievisthekat/blob/master/metrics.plugin.poopmap.svg" alt=""></img>
+      <img alt="" width="400" src="https://github.com/legoandmars/legoandmars/blob/master/metrics.plugin.nightscout.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
   </tr>  <tr>
+    <th><a href="/source/plugins/community/poopmap/README.md">💩 PoopMap plugin</a><br><sup>by <a href="https://github.com/matievisthekat">@matievisthekat</a></sup></th>
     <th><a href="/source/plugins/community/screenshot/README.md">📸 Website screenshot</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
-    <th><a href="/source/plugins/community/splatoon/README.md">🦑 Splatoon</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
   </tr>
   <tr>
     <td  align="center">
-      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.screenshot.svg" alt=""></img>
+      <img alt="" width="400" src="https://github.com/matievisthekat/matievisthekat/blob/master/metrics.plugin.poopmap.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
     <td  align="center">
-      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.splatoon.svg" alt=""></img>
+      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.screenshot.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
   </tr>  <tr>
+    <th><a href="/source/plugins/community/splatoon/README.md">🦑 Splatoon</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
     <th><a href="/source/plugins/community/stock/README.md">💹 Stock prices</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
-    <th></th>
   </tr>
   <tr>
+    <td  align="center">
+      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.splatoon.svg" alt=""></img>
+      <img width="900" height="1" alt="">
+    </td>
     <td  align="center">
       <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stock.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
-<td align="center"><img width="900" height="1" alt=""></td>
   </tr>
 </table>
 
diff --git a/source/plugins/steam/README.md b/source/plugins/steam/README.md
index 8d720a2abab..a2c5fec7e8c 100644
--- a/source/plugins/steam/README.md
+++ b/source/plugins/steam/README.md
@@ -1,9 +1,161 @@
 <!--header-->
+<table>
+  <tr><td colspan="2"><a href="/README.md#-plugins">← Back to plugins index</a></td></tr>
+  <tr><th colspan="2"><h3>🕹️ Steam</h3></th></tr>
+  <tr><td colspan="2" align="center"><p>This plugin can display your player profile and played games from your Steam account.</p>
+</td></tr>
+  <tr><th>⚠️ Disclaimer</th><td><p>This plugin is not affiliated, associated, authorized, endorsed by, or in any way officially connected with <a href="https://store.steampowered.com">Steam</a>.
+All product and company names are trademarks™ or registered® trademarks of their respective holders.</p>
+</td></tr>
+  <tr>
+    <th rowspan="3">Supported features<br><sub><a href="metadata.yml">→ Full specification</a></sub></th>
+    <td><a href="/source/templates/classic/README.md"><code>📗 Classic template</code></a></td>
+  </tr>
+  <tr>
+    <td><code>👤 Users</code> <code>👥 Organizations</code></td>
+  </tr>
+  <tr>
+    <td><code>🗝️ plugin_steam_token</code></td>
+  </tr>
+  <tr>
+    <td colspan="2" align="center">
+      <details open><summary>Recently played games</summary><img src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.steam.svg" alt=""></img></details>
+      <details><summary>Profile and detailed game history</summary><img src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.steam.full.svg" alt=""></img></details>
+      <img width="900" height="1" alt="">
+    </td>
+  </tr>
+</table>
 <!--/header-->
 
 ## ➡️ Available options
 
 <!--options-->
+<table>
+  <tr>
+    <td align="center" nowrap="nowrap">Option</i></td><td align="center" nowrap="nowrap">Description</td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_steam</code></h4></td>
+    <td rowspan="2"><p>Enable steam plugin</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
+<br>
+<b>default:</b> no<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_steam_token</code></h4></td>
+    <td rowspan="2"><p>Steam token</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
+<ul>
+<li><i>metrics.api.steam</i></li>
+</ul>
+<b>type:</b> <code>token</code>
+<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_steam_sections</code></h4></td>
+    <td rowspan="2"><p>Displayed sections</p>
+<ul>
+<li><code>player</code>: display profile</li>
+<li><code>most-played</code>: display most played games</li>
+<li><code>recently-played</code>: display recently played games</li>
+</ul>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
+<i>(comma-separated)</i>
+<br>
+<b>default:</b> player, most-played, recently-played<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_steam_user</code></h4></td>
+    <td rowspan="2"><p>Steam user id</p>
+<p>This can be found on your Steam user account details</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
+<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_steam_games_ignored</code></h4></td>
+    <td rowspan="2"><p>Ignored games</p>
+<p>Use App id as they are referenced in Steam catalog</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
+<i>(comma-separated)</i>
+<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_steam_games_limit</code></h4></td>
+    <td rowspan="2"><p>Display limit (Most played games)</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
+<i>(0 ≤
+𝑥)</i>
+<br>
+<b>zero behaviour:</b> disable</br>
+<b>default:</b> 1<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_steam_recent_games_limit</code></h4></td>
+    <td rowspan="2"><p>Display limit (Recently played games)</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
+<i>(0 ≤
+𝑥)</i>
+<br>
+<b>zero behaviour:</b> disable</br>
+<b>default:</b> 1<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_steam_achievements_limit</code></h4></td>
+    <td rowspan="2"><p>Display limit (Games achievements)</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
+<i>(0 ≤
+𝑥)</i>
+<br>
+<b>default:</b> 2<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_steam_playtime_threshold</code></h4></td>
+    <td rowspan="2"><p>Display threshold (Game playtime in hours)</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
+<i>(0 ≤
+𝑥)</i>
+<br>
+<b>default:</b> 2<br></td>
+  </tr>
+</table>
 <!--/options-->
 
 ## 🗝️ Obtaining a *Steam Web API* token
@@ -19,4 +171,30 @@ To retrieve your Steam ID, access your user account on [store.steampowered.com/a
 ## ℹ️ Examples workflows
 
 <!--examples-->
+```yaml
+name: Recently played games
+uses: lowlighter/metrics@latest
+with:
+  filename: metrics.plugin.steam.svg
+  token: NOT_NEEDED
+  base: ""
+  plugin_steam_token: ${{ secrets.STEAM_TOKEN }}
+  plugin_steam: yes
+  plugin_steam_user: 0
+  plugin_steam_sections: recently-played
+  plugin_steam_achievements_limit: 0
+
+```
+```yaml
+name: Profile and detailed game history
+uses: lowlighter/metrics@latest
+with:
+  filename: metrics.plugin.steam.full.svg
+  token: NOT_NEEDED
+  base: ""
+  plugin_steam_token: ${{ secrets.STEAM_TOKEN }}
+  plugin_steam: yes
+  plugin_steam_user: 0
+
+```
 <!--/examples-->
diff --git a/source/templates/classic/README.md b/source/templates/classic/README.md
index 23509ab111f..c91562c847e 100644
--- a/source/templates/classic/README.md
+++ b/source/templates/classic/README.md
@@ -7,7 +7,7 @@ This is also the default template.</p>
 </td></tr>
   <tr>
     <th rowspan="3">Supported features<br><sub><a href="metadata.yml">→ Full specification</a></sub></th>
-    <td><a href="/source/plugins/achievements/README.md" title="🏆 Achievements">🏆</a> <a href="/source/plugins/activity/README.md" title="📰 Recent activity">📰</a> <a href="/source/plugins/anilist/README.md" title="🌸 Anilist watch list and reading list">🌸</a> <a href="/source/plugins/calendar/README.md" title="📆 Commit calendar">📆</a> <a href="/source/plugins/code/README.md" title="♐ Random code snippet">♐</a> <a href="/source/plugins/chess/README.md" title="♟️ Chess">♟️</a> <a href="/source/plugins/fortune/README.md" title="🥠 Fortune">🥠</a> <a href="/source/plugins/nightscout/README.md" title="💉 Nightscout">💉</a> <a href="/source/plugins/poopmap/README.md" title="💩 PoopMap plugin">💩</a> <a href="/source/plugins/screenshot/README.md" title="📸 Website screenshot">📸</a> <a href="/source/plugins/splatoon/README.md" title="🦑 Splatoon">🦑</a> <a href="/source/plugins/stock/README.md" title="💹 Stock prices">💹</a> <a href="/source/plugins/discussions/README.md" title="💬 Discussions">💬</a> <a href="/source/plugins/followup/README.md" title="🎟️ Follow-up of issues and pull requests">🎟️</a> <a href="/source/plugins/gists/README.md" title="🎫 Gists">🎫</a> <a href="/source/plugins/habits/README.md" title="💡 Coding habits and activity">💡</a> <a href="/source/plugins/introduction/README.md" title="🙋 Introduction">🙋</a> <a href="/source/plugins/isocalendar/README.md" title="📅 Isometric commit calendar">📅</a> <a href="/source/plugins/languages/README.md" title="🈷️ Languages activity">🈷️</a> <a href="/source/plugins/leetcode/README.md" title="🗳️ Leetcode">🗳️</a> <a href="/source/plugins/lines/README.md" title="👨‍💻 Lines of code changed">👨‍💻</a> <a href="/source/plugins/music/README.md" title="🎼 Music activity and suggestions">🎼</a> <a href="/source/plugins/notable/README.md" title="🎩 Notable contributions">🎩</a> <a href="/source/plugins/pagespeed/README.md" title="⏱️ Google PageSpeed">⏱️</a> <a href="/source/plugins/people/README.md" title="🧑‍🤝‍🧑 People">🧑‍🤝‍🧑</a> <a href="/source/plugins/posts/README.md" title="✒️ Recent posts">✒️</a> <a href="/source/plugins/projects/README.md" title="🗂️ GitHub projects">🗂️</a> <a href="/source/plugins/reactions/README.md" title="🎭 Comment reactions">🎭</a> <a href="/source/plugins/repositories/README.md" title="📓 Featured repositories">📓</a> <a href="/source/plugins/rss/README.md" title="🗼 Rss feed">🗼</a> <a href="/source/plugins/skyline/README.md" title="🌇 GitHub Skyline">🌇</a> <a href="/source/plugins/sponsors/README.md" title="💕 GitHub Sponsors">💕</a> <a href="/source/plugins/sponsorships/README.md" title="💝 GitHub Sponsorships">💝</a> <a href="/source/plugins/stackoverflow/README.md" title="🗨️ Stack Overflow">🗨️</a> <a href="/source/plugins/stargazers/README.md" title="✨ Stargazers">✨</a> <a href="/source/plugins/starlists/README.md" title="💫 Star lists">💫</a> <a href="/source/plugins/stars/README.md" title="🌟 Recently starred repositories">🌟</a> <a href="/source/plugins/support/README.md" title="💭 GitHub Community Support">💭</a> <a href="/source/plugins/topics/README.md" title="📌 Starred topics">📌</a> <a href="/source/plugins/traffic/README.md" title="🧮 Repositories traffic">🧮</a> <a href="/source/plugins/tweets/README.md" title="🐤 Latest tweets">🐤</a> <a href="/source/plugins/wakatime/README.md" title="⏰ WakaTime">⏰</a></td>
+    <td><a href="/source/plugins/achievements/README.md" title="🏆 Achievements">🏆</a> <a href="/source/plugins/activity/README.md" title="📰 Recent activity">📰</a> <a href="/source/plugins/anilist/README.md" title="🌸 Anilist watch list and reading list">🌸</a> <a href="/source/plugins/calendar/README.md" title="📆 Commit calendar">📆</a> <a href="/source/plugins/code/README.md" title="♐ Random code snippet">♐</a> <a href="/source/plugins/16personalities/README.md" title="🧠 16personalities">🧠</a> <a href="/source/plugins/chess/README.md" title="♟️ Chess">♟️</a> <a href="/source/plugins/fortune/README.md" title="🥠 Fortune">🥠</a> <a href="/source/plugins/nightscout/README.md" title="💉 Nightscout">💉</a> <a href="/source/plugins/poopmap/README.md" title="💩 PoopMap plugin">💩</a> <a href="/source/plugins/screenshot/README.md" title="📸 Website screenshot">📸</a> <a href="/source/plugins/splatoon/README.md" title="🦑 Splatoon">🦑</a> <a href="/source/plugins/stock/README.md" title="💹 Stock prices">💹</a> <a href="/source/plugins/discussions/README.md" title="💬 Discussions">💬</a> <a href="/source/plugins/followup/README.md" title="🎟️ Follow-up of issues and pull requests">🎟️</a> <a href="/source/plugins/gists/README.md" title="🎫 Gists">🎫</a> <a href="/source/plugins/habits/README.md" title="💡 Coding habits and activity">💡</a> <a href="/source/plugins/introduction/README.md" title="🙋 Introduction">🙋</a> <a href="/source/plugins/isocalendar/README.md" title="📅 Isometric commit calendar">📅</a> <a href="/source/plugins/languages/README.md" title="🈷️ Languages activity">🈷️</a> <a href="/source/plugins/leetcode/README.md" title="🗳️ Leetcode">🗳️</a> <a href="/source/plugins/lines/README.md" title="👨‍💻 Lines of code changed">👨‍💻</a> <a href="/source/plugins/music/README.md" title="🎼 Music activity and suggestions">🎼</a> <a href="/source/plugins/notable/README.md" title="🎩 Notable contributions">🎩</a> <a href="/source/plugins/pagespeed/README.md" title="⏱️ Google PageSpeed">⏱️</a> <a href="/source/plugins/people/README.md" title="🧑‍🤝‍🧑 People">🧑‍🤝‍🧑</a> <a href="/source/plugins/posts/README.md" title="✒️ Recent posts">✒️</a> <a href="/source/plugins/projects/README.md" title="🗂️ GitHub projects">🗂️</a> <a href="/source/plugins/reactions/README.md" title="🎭 Comment reactions">🎭</a> <a href="/source/plugins/repositories/README.md" title="📓 Featured repositories">📓</a> <a href="/source/plugins/rss/README.md" title="🗼 Rss feed">🗼</a> <a href="/source/plugins/skyline/README.md" title="🌇 GitHub Skyline">🌇</a> <a href="/source/plugins/sponsors/README.md" title="💕 GitHub Sponsors">💕</a> <a href="/source/plugins/sponsorships/README.md" title="💝 GitHub Sponsorships">💝</a> <a href="/source/plugins/stackoverflow/README.md" title="🗨️ Stack Overflow">🗨️</a> <a href="/source/plugins/stargazers/README.md" title="✨ Stargazers">✨</a> <a href="/source/plugins/starlists/README.md" title="💫 Star lists">💫</a> <a href="/source/plugins/stars/README.md" title="🌟 Recently starred repositories">🌟</a> <a href="/source/plugins/steam/README.md" title="🕹️ Steam">🕹️</a> <a href="/source/plugins/support/README.md" title="💭 GitHub Community Support">💭</a> <a href="/source/plugins/topics/README.md" title="📌 Starred topics">📌</a> <a href="/source/plugins/traffic/README.md" title="🧮 Repositories traffic">🧮</a> <a href="/source/plugins/tweets/README.md" title="🐤 Latest tweets">🐤</a> <a href="/source/plugins/wakatime/README.md" title="⏰ WakaTime">⏰</a></td>
   </tr>
   <tr>
     <td><code>👤 Users</code> <code>👥 Organizations</code></td>

From 4e8fa0f866856d00edb89c4c95ec3a5c0a09b6f4 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 14 Mar 2023 13:15:04 -0400
Subject: [PATCH 099/196] fix(ci): missing token

---
 .github/scripts/files/examples.yml | 2 ++
 .github/workflows/ci.yml           | 1 +
 .github/workflows/examples.yml     | 2 ++
 3 files changed, 5 insertions(+)

diff --git a/.github/scripts/files/examples.yml b/.github/scripts/files/examples.yml
index 738698c060b..a1cb0591bd6 100644
--- a/.github/scripts/files/examples.yml
+++ b/.github/scripts/files/examples.yml
@@ -22,6 +22,8 @@ on:
         required: true
       SPLATOON_STATINK_TOKEN:
         required: true
+      SIXTEEN_PERSONALITIES_URL:
+        required: true
       SPOTIFY_TOKENS:
         required: true
       STOCK_TOKEN:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 16e923e9523..129255309ad 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -158,6 +158,7 @@ jobs:
       GOOGLE_MAP_TOKEN: ${{ secrets.GOOGLE_MAP_TOKEN }}
       SPLATOON_TOKEN: ${{ secrets.SPLATOON_TOKEN }}
       SPLATOON_STATINK_TOKEN: ${{ secrets.SPLATOON_STATINK_TOKEN }}
+      SIXTEEN_PERSONALITIES_URL: ${{ secrets.SIXTEEN_PERSONALITIES_URL }}
       SPOTIFY_TOKENS: ${{ secrets.SPOTIFY_TOKENS }}
       STOCK_TOKEN: ${{ secrets.STOCK_TOKEN }}
       TWITTER_TOKEN: ${{ secrets.TWITTER_TOKEN }}
diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index b0151b624fe..91c96114dfe 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -22,6 +22,8 @@ on:
         required: true
       SPLATOON_STATINK_TOKEN:
         required: true
+      SIXTEEN_PERSONALITIES_URL:
+        required: true
       SPOTIFY_TOKENS:
         required: true
       STOCK_TOKEN:

From 4e19a3bb46115c6f6f9702fb1fc88995063a29c4 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 14 Mar 2023 13:15:27 -0400
Subject: [PATCH 100/196] feat(plugins/community/splatoon): add fresh season
 data

---
 source/plugins/community/splatoon/assets.mjs | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/source/plugins/community/splatoon/assets.mjs b/source/plugins/community/splatoon/assets.mjs
index 173488febde..556950c5613 100644
--- a/source/plugins/community/splatoon/assets.mjs
+++ b/source/plugins/community/splatoon/assets.mjs
@@ -22,6 +22,8 @@ export default {
     "Wahoo World": "https://cdn.wikimg.net/en/splatoonwiki/images/7/71/S3_Stage_Wahoo_World.png",
     "Brinewater Springs": "https://cdn.wikimg.net/en/splatoonwiki/images/b/bf/S3_Brinewater_Springs.png",
     "Flounder Heights": "https://cdn.wikimg.net/en/splatoonwiki/images/2/23/S3_Stage_Flounder_Heights.png",
+    "Um'ami Ruins": "https://cdn.wikimg.net/en/splatoonwiki/images/9/95/S3_Stage_Um%27ami_Ruins.png",
+    "Manta Maria": "https://cdn.wikimg.net/en/splatoonwiki/images/8/86/S3_Stage_Manta_Maria.png",
   },
   //Game modes
   modes: {
@@ -35,6 +37,7 @@ export default {
   weapons: {
     ".52 Gal": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/e/e3/S3_Weapon_Main_.52_Gal_Flat.png/120px-S3_Weapon_Main_.52_Gal_Flat.png",
     ".96 Gal": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/88/S3_Weapon_Main_.96_Gal_Flat.png/120px-S3_Weapon_Main_.96_Gal_Flat.png",
+    ".96 Gal Deco": "https://cdn.wikimg.net/en/splatoonwiki/images/0/05/S3_Weapon_Main_.96_Gal_Deco_Flat.png",
     "Aerospray MG": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/0/0e/S3_Weapon_Main_Aerospray_MG_Flat.png/120px-S3_Weapon_Main_Aerospray_MG_Flat.png",
     "Aerospray RG": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/2/27/S3_Weapon_Main_Aerospray_RG_Flat.png/120px-S3_Weapon_Main_Aerospray_RG_Flat.png",
     "Ballpoint Splatling": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/78/S3_Weapon_Main_Ballpoint_Splatling_Flat.png/120px-S3_Weapon_Main_Ballpoint_Splatling_Flat.png",
@@ -45,8 +48,10 @@ export default {
     "Carbon Roller Deco": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a7/S3_Weapon_Main_Carbon_Roller_Deco_Flat.png/120px-S3_Weapon_Main_Carbon_Roller_Deco_Flat.png",
     "Carbon Roller": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/77/S3_Weapon_Main_Carbon_Roller_Flat.png/120px-S3_Weapon_Main_Carbon_Roller_Flat.png",
     "Clash Blaster": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a3/S3_Weapon_Main_Clash_Blaster_Flat.png/120px-S3_Weapon_Main_Clash_Blaster_Flat.png",
+    "Clash Blaster Neo": "https://cdn.wikimg.net/en/splatoonwiki/images/e/ef/S3_Weapon_Main_Clash_Blaster_Neo_Flat.png",
     "Classic Squiffer": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/4/48/S3_Weapon_Main_Classic_Squiffer_Flat.png/120px-S3_Weapon_Main_Classic_Squiffer_Flat.png",
     "Custom Splattershot Jr.": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/2/24/S3_Weapon_Main_Custom_Splattershot_Jr._Flat.png/120px-S3_Weapon_Main_Custom_Splattershot_Jr._Flat.png",
+    "Custom Jet Squelcher": "https://cdn.wikimg.net/en/splatoonwiki/images/f/fc/S3_Weapon_Main_Custom_Jet_Squelcher_Flat.png",
     "Dapple Dualies": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a0/S3_Weapon_Main_Dapple_Dualies_Flat.png/120px-S3_Weapon_Main_Dapple_Dualies_Flat.png",
     "Dapple Dualies Nouveau": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a5/S3_Weapon_Main_Dapple_Dualies_Nouveau_Flat.png/120px-S3_Weapon_Main_Dapple_Dualies_Nouveau_Flat.png",
     "Dark Tetra Dualies": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/2/2a/S3_Weapon_Main_Dark_Tetra_Dualies_Flat.png/120px-S3_Weapon_Main_Dark_Tetra_Dualies_Flat.png",
@@ -73,15 +78,20 @@ export default {
     Inkbrush: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/e/e8/S3_Weapon_Main_Inkbrush_Flat.png/120px-S3_Weapon_Main_Inkbrush_Flat.png",
     "Inkbrush Nouveau": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/4/47/S3_Weapon_Main_Inkbrush_Nouveau_Flat.png/120px-S3_Weapon_Main_Inkbrush_Nouveau_Flat.png",
     "Jet Squelcher": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/80/S3_Weapon_Main_Jet_Squelcher_Flat.png/120px-S3_Weapon_Main_Jet_Squelcher_Flat.png",
+    "Krak-On Splat Roller": "https://cdn.wikimg.net/en/splatoonwiki/images/b/bc/S3_Weapon_Main_Krak-On_Splat_Roller_Flat.png",
     "L-3 Nozzlenose": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/b/bd/S3_Weapon_Main_L-3_Nozzlenose_Flat.png/120px-S3_Weapon_Main_L-3_Nozzlenose_Flat.png",
+    "L-3 Nozzlenose D": "https://cdn.wikimg.net/en/splatoonwiki/images/b/bd/S3_Weapon_Main_L-3_Nozzlenose_D_Flat.png",
     "Luna Blaster": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/8e/S3_Weapon_Main_Luna_Blaster_Flat.png/120px-S3_Weapon_Main_Luna_Blaster_Flat.png",
     "Luna Blaster Neo": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/73/S3_Weapon_Main_Luna_Blaster_Neo_Flat.png/120px-S3_Weapon_Main_Luna_Blaster_Neo_Flat.png",
     "Mini Splatling": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/1/16/S3_Weapon_Main_Mini_Splatling_Flat.png/120px-S3_Weapon_Main_Mini_Splatling_Flat.png",
     "N-ZAP '85": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/9/97/S3_Weapon_Main_N-ZAP_%2785_Flat.png/120px-S3_Weapon_Main_N-ZAP_%2785_Flat.png",
+    "N-ZAP '89": "https://cdn.wikimg.net/en/splatoonwiki/images/b/b2/S3_Weapon_Main_N-ZAP_%2789_Flat.png",
     "Nautilus 47": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/b/be/S3_Weapon_Main_Nautilus_47_Flat.png/120px-S3_Weapon_Main_Nautilus_47_Flat.png",
+    "Neo Splash-o-matic": "https://cdn.wikimg.net/en/splatoonwiki/images/a/a9/S3_Weapon_Main_Neo_Splash-o-matic_Flat.png",
     Octobrush: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/9/9a/S3_Weapon_Main_Octobrush_Flat.png/120px-S3_Weapon_Main_Octobrush_Flat.png",
     "Range Blaster": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/7c/S3_Weapon_Main_Range_Blaster_Flat.png/120px-S3_Weapon_Main_Range_Blaster_Flat.png",
     "Rapid Blaster": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/d/dc/S3_Weapon_Main_Rapid_Blaster_Flat.png/120px-S3_Weapon_Main_Rapid_Blaster_Flat.png",
+    "Rapid Blaster Deco": "https://cdn.wikimg.net/en/splatoonwiki/images/c/c8/S3_Weapon_Main_Rapid_Blaster_Deco_Flat.png",
     "Rapid Blaster Pro": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/71/S3_Weapon_Main_Rapid_Blaster_Pro_Flat.png/120px-S3_Weapon_Main_Rapid_Blaster_Pro_Flat.png",
     "REEF-LUX 450": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/6/68/S3_Weapon_Main_REEF-LUX_450_Flat.png/120px-S3_Weapon_Main_REEF-LUX_450_Flat.png",
     "Slosher Deco": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/7/71/S3_Weapon_Main_Slosher_Deco_Flat.png/120px-S3_Weapon_Main_Slosher_Deco_Flat.png",
@@ -105,8 +115,11 @@ export default {
     "Tenta Brella": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/5/53/S3_Weapon_Main_Tenta_Brella_Flat.png/120px-S3_Weapon_Main_Tenta_Brella_Flat.png",
     "Tentatek Splattershot": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/83/S3_Weapon_Main_Tentatek_Splattershot_Flat.png/120px-S3_Weapon_Main_Tentatek_Splattershot_Flat.png",
     "Tri-Slosher": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/0/0e/S3_Weapon_Main_Tri-Slosher_Flat.png/120px-S3_Weapon_Main_Tri-Slosher_Flat.png",
+    "Tri-Slosher Nouveau": "https://cdn.wikimg.net/en/splatoonwiki/images/0/05/S3_Weapon_Main_Tri-Slosher_Nouveau_Flat.png",
     "Tri-Stringer": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/a/a9/S3_Weapon_Main_Tri-Stringer_Flat.png/120px-S3_Weapon_Main_Tri-Stringer_Flat.png",
     "Undercover Brella": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/8c/S3_Weapon_Main_Undercover_Brella_Flat.png/120px-S3_Weapon_Main_Undercover_Brella_Flat.png",
+    "Z+F Splat Charger": "https://cdn.wikimg.net/en/splatoonwiki/images/b/ba/S3_Weapon_Main_Z%2BF_Splat_Charger_Flat.png",
+    "Z+F Splatterscope": "https://cdn.wikimg.net/en/splatoonwiki/images/b/b4/S3_Weapon_Main_Z%2BF_Splatterscope_Flat.png",
     "Zink Mini Splatling": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/6/65/S3_Weapon_Main_Zink_Mini_Splatling_Flat.png/120px-S3_Weapon_Main_Zink_Mini_Splatling_Flat.png",
   },
   //Subweapons icons
@@ -135,9 +148,11 @@ export default {
     "Ink Vac": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/c/cf/S3_Weapon_Special_Ink_Vac.png/120px-S3_Weapon_Special_Ink_Vac.png",
     Inkjet: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/8/80/S3_Weapon_Special_Inkjet.png/120px-S3_Weapon_Special_Inkjet.png",
     "Killer Wail 5.1": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/1/1a/S3_Weapon_Special_Killer_Wail_5.1.png/120px-S3_Weapon_Special_Killer_Wail_5.1.png",
+    "Kraken Royale": "https://cdn.wikimg.net/en/splatoonwiki/images/c/c1/S3_Weapon_Special_Kraken_Royale.png",
     Rainmaker: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/b/b8/S3_Weapon_Special_Rainmaker.png/120px-S3_Weapon_Special_Rainmaker.png",
     Reefslider: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/1/10/S3_Weapon_Special_Reefslider.png/120px-S3_Weapon_Special_Reefslider.png",
     Splashdown: "https://cdn.wikimg.net/en/splatoonwiki/images/2/23/S3_Weapon_Special_Splashdown.png",
+    "Super Chump": "https://cdn.wikimg.net/en/splatoonwiki/images/8/8c/S3_Weapon_Special_Super_Chump.png",
     Tacticooler: "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/c/c0/S3_Weapon_Special_Tacticooler.png/120px-S3_Weapon_Special_Tacticooler.png",
     "Tenta Missiles": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/3/3b/S3_Weapon_Special_Tenta_Missiles.png/120px-S3_Weapon_Special_Tenta_Missiles.png",
     "Triple Inkstrike": "https://cdn.wikimg.net/en/splatoonwiki/images/thumb/3/3a/S3_Weapon_Special_Triple_Inkstrike.png/120px-S3_Weapon_Special_Triple_Inkstrike.png",
@@ -156,6 +171,7 @@ export default {
     Flyfish: "https://cdn.wikimg.net/en/splatoonwiki/images/2/24/S3_Flyfish_icon.png",
     Goldie: "https://cdn.wikimg.net/en/splatoonwiki/images/b/bc/S3_Goldie_icon.png",
     Griller: "https://cdn.wikimg.net/en/splatoonwiki/images/4/49/S3_Griller_icon.png",
+    Horrorboros: "https://cdn.wikimg.net/en/splatoonwiki/images/0/0a/S3_Horrorboros_icon.png",
     Maws: "https://cdn.wikimg.net/en/splatoonwiki/images/8/83/S3_Maws_icon.png",
     Mudmouth: "https://cdn.wikimg.net/en/splatoonwiki/images/0/07/S3_Mudmouth_icon.png",
     Scrapper: "https://cdn.wikimg.net/en/splatoonwiki/images/8/8c/S3_Scrapper_icon.png",

From 1a7484766dc4458700d3dc410e07135ca4c6a9e4 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 14 Mar 2023 13:16:22 -0400
Subject: [PATCH 101/196] feat(plugins/leetcode): add
 `plugin_leetcode_ignored_skills` (closes #1398)

---
 source/plugins/leetcode/index.mjs    | 3 ++-
 source/plugins/leetcode/metadata.yml | 9 +++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/source/plugins/leetcode/index.mjs b/source/plugins/leetcode/index.mjs
index d2fea2cc9ba..e9364b705ba 100644
--- a/source/plugins/leetcode/index.mjs
+++ b/source/plugins/leetcode/index.mjs
@@ -7,7 +7,7 @@ export default async function({login, q, imports, data, queries, account}, {enab
       return null
 
     //Load inputs
-    let {user, sections, "limit.skills": _limit_skills, "limit.recent": _limit_recent} = imports.metadata.plugins.leetcode.inputs({data, account, q})
+    let {user, sections, "limit.skills": _limit_skills, "ignored.skills": _ignored_skills, "limit.recent": _limit_recent} = imports.metadata.plugins.leetcode.inputs({data, account, q})
     const result = {user, sections, languages: [], skills: [], problems: {}, recent: []}
 
     //Languages stats
@@ -24,6 +24,7 @@ export default async function({login, q, imports, data, queries, account}, {enab
       for (const category in skills)
         result.skills.push(...skills[category].map(({tagName: name, problemsSolved: solved}) => ({name, solved, category})))
       result.skills.sort((a, b) => b.solved - a.solved)
+      result.skills = result.skills.filter(({name, category}) => (imports.filters.text(name, _ignored_skills))&&(imports.filters.text(category, _ignored_skills)))
       result.skills = result.skills.slice(0, _limit_skills || Infinity)
     }
 
diff --git a/source/plugins/leetcode/metadata.yml b/source/plugins/leetcode/metadata.yml
index 452d0e15a07..abf18884835 100644
--- a/source/plugins/leetcode/metadata.yml
+++ b/source/plugins/leetcode/metadata.yml
@@ -50,6 +50,15 @@ inputs:
     min: 0
     zero: disable
 
+  plugin_leetcode_ignored_skills:
+    description: |
+      Ignored skills
+
+      It is possible to ignore entires categories by passing `fundamental`, `intermediate` or `advanced`
+    type: array
+    default: ""
+    example: hash table, string, divide and conquer, fundamental
+
   plugin_leetcode_limit_recent:
     description: |
       Display limit (recent)

From e165040e6bde1411a5cd9d5803f98b884062e2a7 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 14 Mar 2023 17:54:55 +0000
Subject: [PATCH 102/196] chore: code formatting

---
 source/plugins/leetcode/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/leetcode/index.mjs b/source/plugins/leetcode/index.mjs
index e9364b705ba..5ef08cdc7b2 100644
--- a/source/plugins/leetcode/index.mjs
+++ b/source/plugins/leetcode/index.mjs
@@ -24,7 +24,7 @@ export default async function({login, q, imports, data, queries, account}, {enab
       for (const category in skills)
         result.skills.push(...skills[category].map(({tagName: name, problemsSolved: solved}) => ({name, solved, category})))
       result.skills.sort((a, b) => b.solved - a.solved)
-      result.skills = result.skills.filter(({name, category}) => (imports.filters.text(name, _ignored_skills))&&(imports.filters.text(category, _ignored_skills)))
+      result.skills = result.skills.filter(({name, category}) => (imports.filters.text(name, _ignored_skills)) && (imports.filters.text(category, _ignored_skills)))
       result.skills = result.skills.slice(0, _limit_skills || Infinity)
     }
 

From b5ada3d1398dbccfc0d62484e269d83d964a7de4 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 14 Mar 2023 17:55:49 +0000
Subject: [PATCH 103/196] ci: auto-regenerate files

---
 README.md                         |  2 +-
 action.yml                        |  4 ++++
 source/plugins/leetcode/README.md | 11 +++++++++++
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index d68554e4fa8..eb85ce83a80 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
   </tr>
   <tr>
     <th colspan="2" align="center">
-      <h3><a href="/README.md#-plugins">🧩 Customizable with 46 plugins and 327 options!</a></h3>
+      <h3><a href="/README.md#-plugins">🧩 Customizable with 46 plugins and 328 options!</a></h3>
     </th>
   </tr>
   <tr>
diff --git a/action.yml b/action.yml
index 7026ff9bc24..75893b521f8 100644
--- a/action.yml
+++ b/action.yml
@@ -1226,6 +1226,10 @@ inputs:
     description: Display limit (skills)
     default: <default-value>
 
+  plugin_leetcode_ignored_skills:
+    description: Ignored skills
+    default: <default-value>
+
   plugin_leetcode_limit_recent:
     description: Display limit (recent)
     default: <default-value>
diff --git a/source/plugins/leetcode/README.md b/source/plugins/leetcode/README.md
index 9f235697af6..5d231b41287 100644
--- a/source/plugins/leetcode/README.md
+++ b/source/plugins/leetcode/README.md
@@ -83,6 +83,17 @@ All product and company names are trademarks™ or registered® trademarks of th
 <br>
 <b>zero behaviour:</b> disable</br>
 <b>default:</b> 10<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_leetcode_ignored_skills</code></h4></td>
+    <td rowspan="2"><p>Ignored skills</p>
+<p>It is possible to ignore entires categories by passing <code>fundamental</code>, <code>intermediate</code> or <code>advanced</code></p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
+<br></td>
   </tr>
   <tr>
     <td nowrap="nowrap"><h4><code>plugin_leetcode_limit_recent</code></h4></td>

From 6ddca1810a2746a20bd90edf190a999849441340 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 15 Mar 2023 19:14:55 -0400
Subject: [PATCH 104/196] chore(deps): migrate from chartist to d3 (closes
 #1142)

---
 .github/actions/spelling/expect.txt |   1 -
 ARCHITECTURE.md                     |   2 -
 package.json                        |   1 -
 source/app/metrics/utils.mjs        | 198 ++++++++++++++++++++++++++--
 4 files changed, 190 insertions(+), 12 deletions(-)

diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt
index 43bd7c8ccc4..0c3e2fbf0b2 100644
--- a/.github/actions/spelling/expect.txt
+++ b/.github/actions/spelling/expect.txt
@@ -211,7 +211,6 @@ Nixinova
 NOASSERTION
 nocase
 nodeca
-nodechartist
 nodejs
 notoken
 octicon
diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md
index 16b018b973f..218b487223c 100644
--- a/ARCHITECTURE.md
+++ b/ARCHITECTURE.md
@@ -119,8 +119,6 @@ Below is a list of used packages.
   * To parse and handle emojis/[twemojis](https://github.com/twitter/twemoji)
 * [jshemas/openGraphScraper](https://github.com/jshemas/openGraphScraper)
   * To retrieve open graphs metadata
-* [panosoft/node-chartist](https://github.com/panosoft/node-chartist) and [gionkunz/chartist-js](https://github.com/gionkunz/chartist-js)
-  * To display embed SVG charts
 * [rbren/rss-parser](https://github.com/rbren/rss-parser)
   * To parse RSS streams
 * [Nixinova/Linguist](https://github.com/Nixinova/Linguist)
diff --git a/package.json b/package.json
index fca3afbad5d..ee6c4561809 100644
--- a/package.json
+++ b/package.json
@@ -84,7 +84,6 @@
     "color": "^4.2.3",
     "gifencoder": "^2.0.1",
     "libxmljs2": "^0.31.0",
-    "node-chartist": "^1.0.5",
     "rss": "^1.2.2",
     "yargs-parser": "^21.1.1"
   }
diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 3e111bfa8a3..621783d5d95 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -207,14 +207,6 @@ export function stripemojis(string) {
   return string.replace(/[^\p{L}\p{N}\p{P}\p{Z}^$\n]/gu, "")
 }
 
-/**Chartist */
-export async function chartist() {
-  const css = `<style data-optimizable="true">${await fs.readFile(paths.join(__module(import.meta.url), "../../../node_modules", "node-chartist/dist/main.css")).catch(_ => "")}</style>`
-  const {default: nodechartist} = await import(url.pathToFileURL(paths.join(__module(import.meta.url), "../../../node_modules", "/node-chartist/lib/index.js")))
-  return (await nodechartist(...arguments))
-    .replace(/class="ct-chart-line">/, `class="ct-chart-line">${css}`)
-}
-
 /**Language analyzer (single file) */
 export async function language({filename, patch}) {
   console.debug(`metrics/language > ${filename}`)
@@ -816,3 +808,193 @@ export class D3node {
     return this.element.select("svg").node()?.outerHTML || ""
   }
 }
+
+/** Graph utilities */
+export const Graph = {
+  /**Timeline graph */
+  timeline() {
+    return this.graph("time", ...arguments)
+  },
+  /**Line graph */
+  line() {
+    return this.graph("line", ...arguments)
+  },
+  /**Basic Graph */
+  graph(type, data, {area = true, points = true, text = true, low = NaN, high = NaN, match = null, labels = null, width = 480, height = 315, ticks = 0} = {}) {
+    //Generate SVG
+    const margin = {top:10, left:10, right:10, bottom:45}
+    const d3n = new D3node()
+    const svg = d3n.createSVG(width, height)
+  
+    //Data
+    const X = data.map(({x}) => x)
+    const start = X.at(0)
+    const end = X.at(-1)
+    const Y = data.map(({y}) => y)
+    const extremum = Math.max(...Y)
+    high = !Number.isNaN(high) ? high : extremum
+    low = !Number.isNaN(low) ? low : 0
+    const T = data.map(({text}, i) => text ?? Y[i])
+
+    //Time range
+    const x = (type === "time" ? d3.scaleTime() : d3.scaleLinear())
+      .domain([start, end])
+      .range([margin.top, width - margin.left - margin.right])
+    let xticks = d3.axisBottom(x).tickSizeOuter(0)
+    if (labels)
+      xticks = xticks.tickFormat((_, i) => labels[i])
+    if (ticks)
+      xticks = xticks.ticks(ticks)
+    svg.append("g")
+      .attr("transform", `translate(${margin.left},${height - margin.bottom})`)
+      .call(xticks)
+      .call(g => g.select(".domain").attr("stroke", "rgba(127, 127, 127, .8)"))
+      .call(g => g.selectAll(".tick line").attr("stroke-opacity", 0.5))
+      .selectAll("text")
+      .attr("transform", "translate(-5,5) rotate(-45)")
+      .style("text-anchor", "end")
+      .style("font-size", 20)
+      .attr("fill", "rgba(127, 127, 127, .8)")
+  
+    //Data range
+    const y = d3.scaleLinear()
+      .domain([high, low])
+      .range([margin.left, height - margin.top - margin.bottom])
+    svg.append("g")
+      .attr("transform", `translate(${margin.left},${margin.top})`)
+      .call(d3.axisRight(y).ticks(Math.round(height/50)).tickSize(width - margin.left - margin.right))
+      .call(g => g.select(".domain").remove())
+      .call(g => g.selectAll(".tick line").attr("stroke-opacity", 0.5).attr("stroke-dasharray", "2,2"))
+      .call(g => g.selectAll(".tick text").attr("x", 0).attr("dy", -4))
+      .selectAll("text")
+      .style("font-size", 20)
+      .attr("fill", "rgba(127, 127, 127, .8)")
+  
+    //Generate graph line
+    const datum = Y.map((y, i) => [X.at(i), y])
+    const tdatum = Y.map((y, i) => [X.at(i), y, T[i]])
+    const xticked = xticks.scale().ticks(xticks.ticks()[0])
+    const yticked = match?.(tdatum, xticked) ?? tdatum
+    svg.append("path")
+      .datum(datum)
+      .attr("transform", `translate(${margin.left},${margin.top})`)
+      .attr(
+        "d",
+        d3.line()
+          .curve(d3.curveLinear)
+          .x(d => x(d[0]))
+          .y(d => y(d[1]))
+      )
+      .attr("fill", "transparent")
+      .attr("stroke", "#87ceeb")
+      .attr("stroke-width", 2)
+    
+    //Generate graph area
+    if (area) {
+      svg.append("path")
+      .datum(datum)
+      .attr("transform", `translate(${margin.left},${margin.top})`)
+      .attr(
+        "d",
+        d3.area()
+          .curve(d3.curveLinear)
+          .x(d => x(d[0]))
+          .y0(d => y(d[1]))
+          .y1(() => y(low)),
+      )
+      .attr("fill", "rgba(88, 166, 255, .1)")
+    }
+  
+    //Generate graph points
+    if (points) {
+      svg.append("g")
+      .selectAll("circle")
+      .data(yticked)
+        .join("circle")
+        .attr("transform", `translate(${margin.left},${margin.top})`)
+        .attr("cx", d => x(d[0]))
+        .attr("cy", d => y(d[1]))
+        .attr("r", 2)
+        .attr("fill", "#106cbc")
+    }
+  
+    //Generate graph text
+    if (text) {
+      svg.append("g")
+        .attr("fill", "currentColor")
+        .attr("text-anchor", "middle")
+        .attr("font-family", "sans-serif")
+        .attr("font-size", 10)
+        .attr("stroke", "white")
+        .attr("stroke-linejoin", "round")
+        .attr("stroke-width", 4)
+        .attr("paint-order", "stroke fill")
+      .selectAll("text")
+      .data(yticked)
+      .join("text")
+        .attr("transform", `translate(${margin.left},${margin.top-4})`)
+        .attr("x", d => x(d[0]))
+        .attr("y", d => y(d[1]))
+        .text(d => d[2] ? d[2] : "")
+        .attr("fill", "rgba(127, 127, 127, .8)")
+    }
+  
+    return d3n.svgString()
+  },
+  /**Pie Graph */
+  pie(data, {colors, width = 480, height = 315} = {}) {
+    //Generate SVG
+    const radius = Math.min(width, height) / 2
+    const d3n = new D3node()
+    const svg = d3n.createSVG(width, height)
+  
+    //Data
+    const K = Object.keys(data)
+    const V = Object.values(data)
+    const I = d3.range(K.length).filter(i => !Number.isNaN(V[i]))
+
+    //Construct arcs
+    const color = d3.scaleOrdinal(K, d3.schemeSpectral[K.length])
+    const arcs = d3.pie().padAngle(1/radius).sort(null).value(i => V[i])(I)
+    const arc = d3.arc().innerRadius(0).outerRadius(radius)
+    const labels = d3.arc().innerRadius(radius/2).outerRadius(radius/2)
+  
+    svg.append("g")
+      .attr("transform", `translate(${width/2},${height/2})`)
+      .attr("stroke", "white")
+      .attr("stroke-width", 1)
+      .attr("stroke-linejoin", "round")
+    .selectAll("path")
+    .data(arcs)
+    .join("path")
+      .attr("fill", d => colors?.[K[d.data]] ?? color(K[d.data]))
+      .attr("d", arc)
+    .append("title")
+      .text(d => `${K[d.data]}\n${V[d.data]}`)
+
+    svg.append("g")
+      .attr("transform", `translate(${width/2},${height/2})`)
+      .attr("font-family", "sans-serif")
+      .attr("font-size", 12)
+      .attr("text-anchor", "middle")
+      .attr("fill", "white")
+      .attr("stroke", "rbga(0,0,0,.9)")
+      .attr("paint-order", "stroke fill")
+    .selectAll("text")
+    .data(arcs)
+    .join("text")
+      .attr("transform", d => `translate(${labels.centroid(d)})`)
+    .selectAll("tspan")
+    .data(d => {
+      const lines = `${K[d.data]}\n${V[d.data]}`.split(/\n/)
+      return (d.endAngle - d.startAngle) > 0.25 ? lines : lines.slice(0, 1)
+    })
+    .join("tspan")
+      .attr("x", 0)
+      .attr("y", (_, i) => `${i * 1.1}em`)
+      .attr("font-weight", (_, i) => i ? null : "bold")
+      .text(d => d)
+
+    return d3n.svgString()
+  }
+}

From 6ae962439c037341ed352984be435a55377e5827 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 15 Mar 2023 19:15:22 -0400
Subject: [PATCH 105/196] feat(plugins/community/stock): migrate to d3

---
 .../web/statics/embed/placeholders/stock.svg  | 131 +++++++++++++-----
 source/plugins/community/stock/index.mjs      |  12 +-
 source/plugins/community/stock/metadata.yml   |   2 +-
 3 files changed, 100 insertions(+), 45 deletions(-)

diff --git a/source/app/web/statics/embed/placeholders/stock.svg b/source/app/web/statics/embed/placeholders/stock.svg
index e4b60b4401d..4220bb3e5fd 100644
--- a/source/app/web/statics/embed/placeholders/stock.svg
+++ b/source/app/web/statics/embed/placeholders/stock.svg
@@ -1,34 +1,99 @@
-<div xmlns="http://www.w3.org/1999/xhtml" class="ct-chart" style="filter: grayscale(0.9)" >
-    <svg xmlns="http://www.w3.org/2000/svg" xmlns:ct="http://gionkunz.github.com/chartist-js/ct" width="480" height="160" class="ct-chart-line">
-        <!-- (optimized css) -->
-        <g class="ct-grids">
-            <line y1="125" y2="125" x1="50" x2="465" class="ct-grid ct-vertical"/>
-            <line y1="103" y2="103" x1="50" x2="465" class="ct-grid ct-vertical"/>
-            <line y1="81" y2="81" x1="50" x2="465" class="ct-grid ct-vertical"/>
-            <line y1="59" y2="59" x1="50" x2="465" class="ct-grid ct-vertical"/>
-            <line y1="37" y2="37" x1="50" x2="465" class="ct-grid ct-vertical"/>
-            <line y1="15" y2="15" x1="50" x2="465" class="ct-grid ct-vertical"/>
-        </g>
-        <g>
-            <g class="ct-series ct-series-a">
-                <path d="M50,125L50,60.881C50.732,59.554,51.464,58.019,52.196,56.899C52.928,55.779,53.66,53.995,54.392,53.995C55.123,53.995,55.855,54.611,56.587,54.611C57.319,54.611,58.051,50.761,58.783,50.761C59.515,50.761,60.247,51.289,60.979,51.289C61.711,51.289,62.443,50.57,63.175,49.837C63.907,49.104,64.638,45.915,65.37,45.316C66.102,44.717,66.834,44.456,67.566,44.194C68.298,43.932,69.03,43.589,69.762,43.589C70.494,43.589,71.226,44.7,71.958,44.7C72.69,44.7,73.422,44.282,74.153,44.282C74.885,44.282,75.617,47.34,76.349,47.34C77.081,47.34,77.813,45.061,78.545,44.7C79.277,44.339,80.009,44.018,80.741,44.018C81.473,44.018,82.205,44.59,82.937,44.59C83.668,44.59,84.4,43.077,85.132,43.028C85.864,42.979,86.596,42.997,87.328,42.951C88.06,42.905,88.792,42.599,89.524,42.225C90.256,41.851,90.988,40.05,91.72,39.75C92.451,39.45,93.183,39.463,93.915,39.2C94.647,38.938,95.379,37.814,96.111,37.814C96.843,37.814,97.575,41.158,98.307,41.158C99.039,41.158,99.771,41.115,100.503,41.037C101.235,40.959,101.966,37.198,102.698,37.198C103.43,37.198,104.162,37.305,104.894,37.44C105.626,37.575,106.358,38.694,107.09,38.694C107.822,38.694,108.554,37.209,109.286,37.209C110.018,37.209,110.75,37.745,111.481,38.32C112.213,38.895,112.945,42.17,113.677,42.17C114.409,42.17,115.141,39.216,115.873,39.112C116.605,39.008,117.337,38.947,118.069,38.947C118.801,38.947,119.533,39.825,120.265,39.86C120.996,39.895,121.728,39.915,122.46,39.915C123.192,39.915,123.924,39.915,124.656,39.915C125.388,39.915,126.12,39.728,126.852,39.728C127.584,39.728,128.316,44.272,129.048,45.305C129.78,46.338,130.511,46.774,131.243,47.45C131.975,48.126,132.707,49.375,133.439,49.375C134.171,49.375,134.903,49.1,135.635,49.1C136.367,49.1,137.099,51.377,137.831,51.377C138.563,51.377,139.295,50.491,140.026,50.057C140.758,49.623,141.49,49.184,142.222,48.77C142.954,48.356,143.686,47.571,144.418,47.571C145.15,47.571,145.882,48.01,146.614,48.308C147.346,48.606,148.078,49.441,148.81,49.441C149.541,49.441,150.273,48.553,151.005,48C151.737,47.447,152.469,46.652,153.201,46.042C153.933,45.432,154.665,44.368,155.397,44.326C156.129,44.284,156.861,44.26,157.593,44.26C158.325,44.26,159.056,44.282,159.788,44.282C160.52,44.282,161.252,41.578,161.984,40.663C162.716,39.748,163.448,38.452,164.18,38.452C164.912,38.452,165.644,39.561,166.376,40.113C167.108,40.665,167.84,41.763,168.571,41.763C169.303,41.763,170.035,38.14,170.767,38.133C171.499,38.126,172.231,38.122,172.963,38.122C173.695,38.122,174.427,38.594,175.159,38.716C175.891,38.838,176.623,38.98,177.354,38.98C178.086,38.98,178.818,38.65,179.55,38.65C180.282,38.65,181.014,38.943,181.746,39.288C182.478,39.633,183.21,42.038,183.942,42.038C184.674,42.038,185.406,40.498,186.138,40.498C186.869,40.498,187.601,55.117,188.333,55.117C189.065,55.117,189.797,52.07,190.529,52.07C191.261,52.07,191.993,55.502,192.725,55.502C193.457,55.502,194.189,52.496,194.921,51.146C195.653,49.796,196.384,47.631,197.116,47.362C197.848,47.093,198.58,47.2,199.312,46.911C200.044,46.623,200.776,36.208,201.508,36.208C202.24,36.208,202.972,37.606,203.704,38.826C204.436,40.046,205.168,44.903,205.899,44.903C206.631,44.903,207.363,42.785,208.095,42.785C208.827,42.785,209.559,52.592,210.291,52.592C211.023,52.592,211.755,50.477,212.487,49.754C213.219,49.032,213.951,48,214.683,48C215.414,48,216.146,50.274,216.878,51.729C217.61,53.184,218.342,56.994,219.074,56.994C219.806,56.994,220.538,55.799,221.27,55.799C222.002,55.799,222.734,56.16,223.466,56.16C224.198,56.16,224.929,56.069,225.661,56.069C226.393,56.069,227.125,58.692,227.857,58.692C228.589,58.692,229.321,53.71,230.053,52.697C230.785,51.684,231.517,51.329,232.249,50.662C232.981,49.995,233.713,49.336,234.444,48.693C235.176,48.05,235.908,46.801,236.64,46.801C237.372,46.801,238.104,48.006,238.836,48.649C239.568,49.292,240.3,50.667,241.032,50.667C241.764,50.667,242.496,49.648,243.228,48.748C243.959,47.848,244.691,44.205,245.423,44.205C246.155,44.205,246.887,45.797,247.619,46.009C248.351,46.221,249.083,46.394,249.815,46.394C250.547,46.394,251.279,45.468,252.011,44.722C252.743,43.976,253.474,41.336,254.206,41.336C254.938,41.336,255.67,41.359,256.402,41.4C257.134,41.441,257.866,43.513,258.598,43.589C259.33,43.665,260.062,43.634,260.794,43.71C261.526,43.786,262.257,45.525,262.989,45.525C263.721,45.525,264.453,41.95,265.185,41.95C265.917,41.95,266.649,44.579,267.381,44.579C268.113,44.579,268.845,42.926,269.577,41.587C270.309,40.248,271.041,35.787,271.772,35.482C272.504,35.177,273.236,35.089,273.968,34.987C274.7,34.885,275.432,34.878,276.164,34.767C276.896,34.656,277.628,34.074,278.36,34.074C279.092,34.074,279.824,41.07,280.556,41.07C281.287,41.07,282.019,40.914,282.751,40.696C283.483,40.478,284.215,38.089,284.947,38.089C285.679,38.089,286.411,38.754,287.143,38.754C287.875,38.754,288.607,38.611,289.339,38.535C290.071,38.459,290.802,38.298,291.534,38.298C292.266,38.298,292.998,40.596,293.73,40.69C294.462,40.783,295.194,40.839,295.926,40.839C296.658,40.839,297.39,39.176,298.122,38.87C298.854,38.564,299.586,38.624,300.317,38.271C301.049,37.917,301.781,33.7,302.513,33.7C303.245,33.7,303.977,36.785,304.709,36.785C305.441,36.785,306.173,19.559,306.905,19.228C307.637,18.898,308.369,18.718,309.101,18.718C309.832,18.718,310.564,37.385,311.296,37.385C312.028,37.385,312.76,32.93,313.492,32.93C314.224,32.93,314.956,35.73,315.688,35.73C316.42,35.73,317.152,25.901,317.884,25.901C318.616,25.901,319.347,32.375,320.079,32.375C320.811,32.375,321.543,18.201,322.275,18.201C323.007,18.201,323.739,27.381,324.471,32.237C325.203,37.093,325.935,47.377,326.667,47.377C327.399,47.377,328.131,42.093,328.862,42.093C329.594,42.093,330.326,42.738,331.058,43.831C331.79,44.924,332.522,64.061,333.254,72.727C333.986,81.394,334.718,96.356,335.45,96.356C336.182,96.356,336.914,75.731,337.646,75.731C338.377,75.731,339.109,79.211,339.841,80.164C340.573,81.118,341.305,82.276,342.037,82.276C342.769,82.276,343.501,60.177,344.233,60.177C344.965,60.177,345.697,68.287,346.429,69.527C347.16,70.767,347.892,71.848,348.624,71.848C349.356,71.848,350.088,63.466,350.82,63.466C351.552,63.466,352.284,64.863,353.016,64.863C353.748,64.863,354.48,62.327,355.212,61.816C355.944,61.305,356.675,61.424,357.407,60.793C358.139,60.162,358.871,48.132,359.603,48.132C360.335,48.132,361.067,116.871,361.799,116.871C362.531,116.871,363.263,109.352,363.995,104.1C364.727,98.848,365.459,83.541,366.19,83.541C366.922,83.541,367.654,85.114,368.386,85.956C369.118,86.797,369.85,88.601,370.582,88.601C371.314,88.601,372.046,83.585,372.778,83.585C373.51,83.585,374.242,86.159,374.974,86.159C375.705,86.159,376.437,69.856,377.169,65.325C377.901,60.794,378.633,55.238,379.365,55.238C380.097,55.238,380.829,65.157,381.561,65.732C382.293,66.307,383.025,66.131,383.757,66.673C384.489,67.214,385.22,72.607,385.952,72.607C386.684,72.607,387.416,61.408,388.148,60.1C388.88,58.792,389.612,58.012,390.344,57.773C391.076,57.535,391.808,57.565,392.54,57.35C393.272,57.135,394.004,56.661,394.735,56.008C395.467,55.355,396.199,52.389,396.931,52.389C397.663,52.389,398.395,56.393,399.127,56.393C399.859,56.393,400.591,24.663,401.323,24.663C402.055,24.663,402.787,28.018,403.519,30.4C404.25,32.782,404.982,36.577,405.714,39.871C406.446,43.165,407.178,45.65,407.91,50.2C408.642,54.75,409.374,70.319,410.106,70.319C410.838,70.319,411.57,63.305,412.302,62.542C413.034,61.779,413.765,61.2,414.497,61.2C415.229,61.2,415.961,62.421,416.693,62.421C417.425,62.421,418.157,52.4,418.889,52.4C419.621,52.4,420.353,57.9,421.085,57.9C421.817,57.9,422.549,55.7,423.28,55.7C424.012,55.7,424.744,56.365,425.476,56.613C426.208,56.861,426.94,57.037,427.672,57.24C428.404,57.443,429.136,57.834,429.868,57.834C430.6,57.834,431.332,56.36,432.063,56.36C432.795,56.36,433.527,56.49,434.259,56.646C434.991,56.802,435.723,57.404,436.455,57.944C437.187,58.484,437.919,59.808,438.651,60.1C439.383,60.392,440.115,60.452,440.847,60.65C441.578,60.848,442.31,60.914,443.042,61.299C443.774,61.684,444.506,65.039,445.238,66.557C445.97,68.075,446.702,70.261,447.434,70.572C448.166,70.883,448.898,71.1,449.63,71.1C450.362,71.1,451.093,69.153,451.825,69.153C452.557,69.153,453.289,71.1,454.021,71.1C454.753,71.1,455.485,69.978,456.217,69.978C456.949,69.978,457.681,71.1,458.413,71.1C459.145,71.1,459.877,68.9,460.608,68.9C461.34,68.9,462.072,69.993,462.804,70.539L462.804,125Z" class="ct-area"/>
-                <path d="M50,60.881C50.732,59.554,51.464,58.019,52.196,56.899C52.928,55.779,53.66,53.995,54.392,53.995C55.123,53.995,55.855,54.611,56.587,54.611C57.319,54.611,58.051,50.761,58.783,50.761C59.515,50.761,60.247,51.289,60.979,51.289C61.711,51.289,62.443,50.57,63.175,49.837C63.907,49.104,64.638,45.915,65.37,45.316C66.102,44.717,66.834,44.456,67.566,44.194C68.298,43.932,69.03,43.589,69.762,43.589C70.494,43.589,71.226,44.7,71.958,44.7C72.69,44.7,73.422,44.282,74.153,44.282C74.885,44.282,75.617,47.34,76.349,47.34C77.081,47.34,77.813,45.061,78.545,44.7C79.277,44.339,80.009,44.018,80.741,44.018C81.473,44.018,82.205,44.59,82.937,44.59C83.668,44.59,84.4,43.077,85.132,43.028C85.864,42.979,86.596,42.997,87.328,42.951C88.06,42.905,88.792,42.599,89.524,42.225C90.256,41.851,90.988,40.05,91.72,39.75C92.451,39.45,93.183,39.463,93.915,39.2C94.647,38.938,95.379,37.814,96.111,37.814C96.843,37.814,97.575,41.158,98.307,41.158C99.039,41.158,99.771,41.115,100.503,41.037C101.235,40.959,101.966,37.198,102.698,37.198C103.43,37.198,104.162,37.305,104.894,37.44C105.626,37.575,106.358,38.694,107.09,38.694C107.822,38.694,108.554,37.209,109.286,37.209C110.018,37.209,110.75,37.745,111.481,38.32C112.213,38.895,112.945,42.17,113.677,42.17C114.409,42.17,115.141,39.216,115.873,39.112C116.605,39.008,117.337,38.947,118.069,38.947C118.801,38.947,119.533,39.825,120.265,39.86C120.996,39.895,121.728,39.915,122.46,39.915C123.192,39.915,123.924,39.915,124.656,39.915C125.388,39.915,126.12,39.728,126.852,39.728C127.584,39.728,128.316,44.272,129.048,45.305C129.78,46.338,130.511,46.774,131.243,47.45C131.975,48.126,132.707,49.375,133.439,49.375C134.171,49.375,134.903,49.1,135.635,49.1C136.367,49.1,137.099,51.377,137.831,51.377C138.563,51.377,139.295,50.491,140.026,50.057C140.758,49.623,141.49,49.184,142.222,48.77C142.954,48.356,143.686,47.571,144.418,47.571C145.15,47.571,145.882,48.01,146.614,48.308C147.346,48.606,148.078,49.441,148.81,49.441C149.541,49.441,150.273,48.553,151.005,48C151.737,47.447,152.469,46.652,153.201,46.042C153.933,45.432,154.665,44.368,155.397,44.326C156.129,44.284,156.861,44.26,157.593,44.26C158.325,44.26,159.056,44.282,159.788,44.282C160.52,44.282,161.252,41.578,161.984,40.663C162.716,39.748,163.448,38.452,164.18,38.452C164.912,38.452,165.644,39.561,166.376,40.113C167.108,40.665,167.84,41.763,168.571,41.763C169.303,41.763,170.035,38.14,170.767,38.133C171.499,38.126,172.231,38.122,172.963,38.122C173.695,38.122,174.427,38.594,175.159,38.716C175.891,38.838,176.623,38.98,177.354,38.98C178.086,38.98,178.818,38.65,179.55,38.65C180.282,38.65,181.014,38.943,181.746,39.288C182.478,39.633,183.21,42.038,183.942,42.038C184.674,42.038,185.406,40.498,186.138,40.498C186.869,40.498,187.601,55.117,188.333,55.117C189.065,55.117,189.797,52.07,190.529,52.07C191.261,52.07,191.993,55.502,192.725,55.502C193.457,55.502,194.189,52.496,194.921,51.146C195.653,49.796,196.384,47.631,197.116,47.362C197.848,47.093,198.58,47.2,199.312,46.911C200.044,46.623,200.776,36.208,201.508,36.208C202.24,36.208,202.972,37.606,203.704,38.826C204.436,40.046,205.168,44.903,205.899,44.903C206.631,44.903,207.363,42.785,208.095,42.785C208.827,42.785,209.559,52.592,210.291,52.592C211.023,52.592,211.755,50.477,212.487,49.754C213.219,49.032,213.951,48,214.683,48C215.414,48,216.146,50.274,216.878,51.729C217.61,53.184,218.342,56.994,219.074,56.994C219.806,56.994,220.538,55.799,221.27,55.799C222.002,55.799,222.734,56.16,223.466,56.16C224.198,56.16,224.929,56.069,225.661,56.069C226.393,56.069,227.125,58.692,227.857,58.692C228.589,58.692,229.321,53.71,230.053,52.697C230.785,51.684,231.517,51.329,232.249,50.662C232.981,49.995,233.713,49.336,234.444,48.693C235.176,48.05,235.908,46.801,236.64,46.801C237.372,46.801,238.104,48.006,238.836,48.649C239.568,49.292,240.3,50.667,241.032,50.667C241.764,50.667,242.496,49.648,243.228,48.748C243.959,47.848,244.691,44.205,245.423,44.205C246.155,44.205,246.887,45.797,247.619,46.009C248.351,46.221,249.083,46.394,249.815,46.394C250.547,46.394,251.279,45.468,252.011,44.722C252.743,43.976,253.474,41.336,254.206,41.336C254.938,41.336,255.67,41.359,256.402,41.4C257.134,41.441,257.866,43.513,258.598,43.589C259.33,43.665,260.062,43.634,260.794,43.71C261.526,43.786,262.257,45.525,262.989,45.525C263.721,45.525,264.453,41.95,265.185,41.95C265.917,41.95,266.649,44.579,267.381,44.579C268.113,44.579,268.845,42.926,269.577,41.587C270.309,40.248,271.041,35.787,271.772,35.482C272.504,35.177,273.236,35.089,273.968,34.987C274.7,34.885,275.432,34.878,276.164,34.767C276.896,34.656,277.628,34.074,278.36,34.074C279.092,34.074,279.824,41.07,280.556,41.07C281.287,41.07,282.019,40.914,282.751,40.696C283.483,40.478,284.215,38.089,284.947,38.089C285.679,38.089,286.411,38.754,287.143,38.754C287.875,38.754,288.607,38.611,289.339,38.535C290.071,38.459,290.802,38.298,291.534,38.298C292.266,38.298,292.998,40.596,293.73,40.69C294.462,40.783,295.194,40.839,295.926,40.839C296.658,40.839,297.39,39.176,298.122,38.87C298.854,38.564,299.586,38.624,300.317,38.271C301.049,37.917,301.781,33.7,302.513,33.7C303.245,33.7,303.977,36.785,304.709,36.785C305.441,36.785,306.173,19.559,306.905,19.228C307.637,18.898,308.369,18.718,309.101,18.718C309.832,18.718,310.564,37.385,311.296,37.385C312.028,37.385,312.76,32.93,313.492,32.93C314.224,32.93,314.956,35.73,315.688,35.73C316.42,35.73,317.152,25.901,317.884,25.901C318.616,25.901,319.347,32.375,320.079,32.375C320.811,32.375,321.543,18.201,322.275,18.201C323.007,18.201,323.739,27.381,324.471,32.237C325.203,37.093,325.935,47.377,326.667,47.377C327.399,47.377,328.131,42.093,328.862,42.093C329.594,42.093,330.326,42.738,331.058,43.831C331.79,44.924,332.522,64.061,333.254,72.727C333.986,81.394,334.718,96.356,335.45,96.356C336.182,96.356,336.914,75.731,337.646,75.731C338.377,75.731,339.109,79.211,339.841,80.164C340.573,81.118,341.305,82.276,342.037,82.276C342.769,82.276,343.501,60.177,344.233,60.177C344.965,60.177,345.697,68.287,346.429,69.527C347.16,70.767,347.892,71.848,348.624,71.848C349.356,71.848,350.088,63.466,350.82,63.466C351.552,63.466,352.284,64.863,353.016,64.863C353.748,64.863,354.48,62.327,355.212,61.816C355.944,61.305,356.675,61.424,357.407,60.793C358.139,60.162,358.871,48.132,359.603,48.132C360.335,48.132,361.067,116.871,361.799,116.871C362.531,116.871,363.263,109.352,363.995,104.1C364.727,98.848,365.459,83.541,366.19,83.541C366.922,83.541,367.654,85.114,368.386,85.956C369.118,86.797,369.85,88.601,370.582,88.601C371.314,88.601,372.046,83.585,372.778,83.585C373.51,83.585,374.242,86.159,374.974,86.159C375.705,86.159,376.437,69.856,377.169,65.325C377.901,60.794,378.633,55.238,379.365,55.238C380.097,55.238,380.829,65.157,381.561,65.732C382.293,66.307,383.025,66.131,383.757,66.673C384.489,67.214,385.22,72.607,385.952,72.607C386.684,72.607,387.416,61.408,388.148,60.1C388.88,58.792,389.612,58.012,390.344,57.773C391.076,57.535,391.808,57.565,392.54,57.35C393.272,57.135,394.004,56.661,394.735,56.008C395.467,55.355,396.199,52.389,396.931,52.389C397.663,52.389,398.395,56.393,399.127,56.393C399.859,56.393,400.591,24.663,401.323,24.663C402.055,24.663,402.787,28.018,403.519,30.4C404.25,32.782,404.982,36.577,405.714,39.871C406.446,43.165,407.178,45.65,407.91,50.2C408.642,54.75,409.374,70.319,410.106,70.319C410.838,70.319,411.57,63.305,412.302,62.542C413.034,61.779,413.765,61.2,414.497,61.2C415.229,61.2,415.961,62.421,416.693,62.421C417.425,62.421,418.157,52.4,418.889,52.4C419.621,52.4,420.353,57.9,421.085,57.9C421.817,57.9,422.549,55.7,423.28,55.7C424.012,55.7,424.744,56.365,425.476,56.613C426.208,56.861,426.94,57.037,427.672,57.24C428.404,57.443,429.136,57.834,429.868,57.834C430.6,57.834,431.332,56.36,432.063,56.36C432.795,56.36,433.527,56.49,434.259,56.646C434.991,56.802,435.723,57.404,436.455,57.944C437.187,58.484,437.919,59.808,438.651,60.1C439.383,60.392,440.115,60.452,440.847,60.65C441.578,60.848,442.31,60.914,443.042,61.299C443.774,61.684,444.506,65.039,445.238,66.557C445.97,68.075,446.702,70.261,447.434,70.572C448.166,70.883,448.898,71.1,449.63,71.1C450.362,71.1,451.093,69.153,451.825,69.153C452.557,69.153,453.289,71.1,454.021,71.1C454.753,71.1,455.485,69.978,456.217,69.978C456.949,69.978,457.681,71.1,458.413,71.1C459.145,71.1,459.877,68.9,460.608,68.9C461.34,68.9,462.072,69.993,462.804,70.539" class="ct-line"/>
-            </g>
-        </g>
-        <g class="ct-labels">
-            <text x="50" y="145" width="2.195767195767196" height="20" class="ct-label ct-horizontal ct-end">26/01, 09:00</text>
-            <text x="153.2010582010582" y="145" width="2.195767195767189" height="20" class="ct-label ct-horizontal ct-end">26/01, 12:55</text>
-            <text x="256.4021164021164" y="145" width="2.195767195767189" height="20" class="ct-label ct-horizontal ct-end">26/01, 17:05</text>
-            <text x="359.60317460317464" y="145" width="2.195767195767189" height="20" class="ct-label ct-horizontal ct-end">26/01, 21:00</text>
-            <text x="462.8042328042328" y="145" width="30" height="20" class="ct-label ct-horizontal ct-end">27/01, 00:55</text>
-            <text y="125" x="40" height="22" width="30" class="ct-label ct-vertical ct-start">880</text>
-            <text y="103" x="40" height="22" width="30" class="ct-label ct-vertical ct-start">900</text>
-            <text y="81" x="40" height="22" width="30" class="ct-label ct-vertical ct-start">920</text>
-            <text y="59" x="40" height="22" width="30" class="ct-label ct-vertical ct-start">940</text>
-            <text y="37" x="40" height="22" width="30" class="ct-label ct-vertical ct-start">960</text>
-            <text y="15" x="40" height="30" width="30" class="ct-label ct-vertical ct-start">980</text>
-        </g>
-    </svg>
-    <div class="ct-legend">
-    </div>
+<div xmlns="http://www.w3.org/1999/xhtml" class="ct-chart" style="filter: grayscale(0.9)">
+  <svg xmlns="http://www.w3.org/2000/svg" width="480" height="200">
+    <g transform="translate(10,155)" fill="none" font-size="10" font-family="sans-serif"
+      text-anchor="middle">
+      <path class="domain" stroke="rgba(127, 127, 127, .8)" d="M10.5,0.5H460.5" />
+      <g class="tick" opacity="1" transform="translate(10.5,0)">
+        <line stroke="currentColor" y2="6" stroke-opacity="0.5" />
+        <text fill="rgba(127, 127, 127, .8)" y="9" dy="0.71em"
+          transform="translate(-5,5) rotate(-45)" style="text-anchor: end;">04 AM</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(57.69179678396644,0)">
+        <line stroke="currentColor" y2="6" stroke-opacity="0.5" />
+        <text fill="rgba(127, 127, 127, .8)" y="9" dy="0.71em"
+          transform="translate(-5,5) rotate(-45)" style="text-anchor: end;">05 AM</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(104.88359356793288,0)">
+        <line stroke="currentColor" y2="6" stroke-opacity="0.5" />
+        <text fill="rgba(127, 127, 127, .8)" y="9" dy="0.71em"
+          transform="translate(-5,5) rotate(-45)" style="text-anchor: end;">06 AM</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(152.07539035189933,0)">
+        <line stroke="currentColor" y2="6" stroke-opacity="0.5" />
+        <text fill="rgba(127, 127, 127, .8)" y="9" dy="0.71em"
+          transform="translate(-5,5) rotate(-45)" style="text-anchor: end;">07 AM</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(199.26718713586575,0)">
+        <line stroke="currentColor" y2="6" stroke-opacity="0.5" />
+        <text fill="rgba(127, 127, 127, .8)" y="9" dy="0.71em"
+          transform="translate(-5,5) rotate(-45)" style="text-anchor: end;">08 AM</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(246.4589839198322,0)">
+        <line stroke="currentColor" y2="6" stroke-opacity="0.5" />
+        <text fill="rgba(127, 127, 127, .8)" y="9" dy="0.71em"
+          transform="translate(-5,5) rotate(-45)" style="text-anchor: end;">09 AM</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(293.65078070379866,0)">
+        <line stroke="currentColor" y2="6" stroke-opacity="0.5" />
+        <text fill="rgba(127, 127, 127, .8)" y="9" dy="0.71em"
+          transform="translate(-5,5) rotate(-45)" style="text-anchor: end;">10 AM</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(340.8425774877651,0)">
+        <line stroke="currentColor" y2="6" stroke-opacity="0.5" />
+        <text fill="rgba(127, 127, 127, .8)" y="9" dy="0.71em"
+          transform="translate(-5,5) rotate(-45)" style="text-anchor: end;">11 AM</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(388.0343742717315,0)">
+        <line stroke="currentColor" y2="6" stroke-opacity="0.5" />
+        <text fill="rgba(127, 127, 127, .8)" y="9" dy="0.71em"
+          transform="translate(-5,5) rotate(-45)" style="text-anchor: end;">12 PM</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(435.22617105569793,0)">
+        <line stroke="currentColor" y2="6" stroke-opacity="0.5" />
+        <text fill="rgba(127, 127, 127, .8)" y="9" dy="0.71em"
+          transform="translate(-5,5) rotate(-45)" style="text-anchor: end;">01 PM</text>
+      </g>
+    </g>
+    <g transform="translate(10,10)" fill="none" font-size="10" font-family="sans-serif"
+      text-anchor="start">
+      <g class="tick" opacity="1" transform="translate(0,22.525291066853548)">
+        <line stroke="currentColor" x2="460" stroke-opacity="0.5" stroke-dasharray="2,2" />
+        <text fill="rgba(127, 127, 127, .8)" x="0" dy="-4">264</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(0,38.45465750897091)">
+        <line stroke="currentColor" x2="460" stroke-opacity="0.5" stroke-dasharray="2,2" />
+        <text fill="rgba(127, 127, 127, .8)" x="0" dy="-4">263</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(0,54.38402395108828)">
+        <line stroke="currentColor" x2="460" stroke-opacity="0.5" stroke-dasharray="2,2" />
+        <text fill="rgba(127, 127, 127, .8)" x="0" dy="-4">262</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(0,70.31339039320562)">
+        <line stroke="currentColor" x2="460" stroke-opacity="0.5" stroke-dasharray="2,2" />
+        <text fill="rgba(127, 127, 127, .8)" x="0" dy="-4">261</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(0,86.24275683532298)">
+        <line stroke="currentColor" x2="460" stroke-opacity="0.5" stroke-dasharray="2,2" />
+        <text fill="rgba(127, 127, 127, .8)" x="0" dy="-4">260</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(0,102.17212327744035)">
+        <line stroke="currentColor" x2="460" stroke-opacity="0.5" stroke-dasharray="2,2" />
+        <text fill="rgba(127, 127, 127, .8)" x="0" dy="-4">259</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(0,118.1014897195577)">
+        <line stroke="currentColor" x2="460" stroke-opacity="0.5" stroke-dasharray="2,2" />
+        <text fill="rgba(127, 127, 127, .8)" x="0" dy="-4">258</text>
+      </g>
+      <g class="tick" opacity="1" transform="translate(0,134.03085616167508)">
+        <line stroke="currentColor" x2="460" stroke-opacity="0.5" stroke-dasharray="2,2" />
+        <text fill="rgba(127, 127, 127, .8)" x="0" dy="-4">257</text>
+      </g>
+    </g>
+    <path transform="translate(10,10)"
+      d="M10,71.088L13.933,65.035L17.865,65.512L21.798,60.574L25.731,64.238L29.663,63.123L33.596,65.672L37.529,63.123L41.461,59.778L45.394,56.911L49.326,61.212L53.259,63.442L57.192,63.601L61.124,66.468L65.057,66.468L68.99,65.831L72.922,72.999L76.855,78.415L80.788,82.398L84.72,84.15L88.653,96.893L92.586,84.309L96.518,94.663L100.451,95.778L104.384,99.123L108.316,102.787L112.249,106.292L116.182,96.893L120.114,104.858L124.047,112.663L127.979,101.831L131.912,114.097L135.845,122.221L139.777,133.531L143.71,130.345L147.643,127.159L151.575,124.77L155.508,119.672L159.441,116.009L163.373,127.318L167.306,124.292L171.239,130.345L175.171,145L179.104,140.062L183.037,138.15L186.969,142.451L190.902,126.203L194.835,132.575L198.767,139.903L202.7,136.08L206.632,131.938L210.565,134.009L214.498,128.433L218.43,128.752L222.363,125.566L226.296,133.212L230.228,132.734L234.161,131.46L238.094,124.427L242.026,122.062L245.959,117.872L249.892,124.451L253.824,119.513L269.555,59.778L273.488,72.841L277.42,63.92L281.353,65.035L285.285,35.565L289.218,47.671L293.151,18.68L297.083,29.194L301.016,49.264L304.949,46.399L308.881,49.742L312.814,47.831L316.747,56.592L320.679,38.353L324.612,42.574L328.545,42.255L332.477,28.716L336.41,10L340.343,21.866L344.275,28.079L348.208,21.229L352.141,20.273L356.073,21.229L360.006,25.211L363.938,28.238L367.871,31.742L371.804,24.096L375.736,16.37L379.669,28.397L383.602,20.432L387.534,27.76L391.467,43.371L395.4,52.769L399.332,45.919L403.265,51.654L407.198,54.68L411.13,48.468L415.063,53.725L418.996,56.154L422.928,50.857L426.861,53.088L430.794,55.795L434.726,55.477L438.659,41.619L442.591,25.052L446.524,26.326L450.457,26.167L454.389,20.114L458.322,21.07L460,22.663"
+      fill="transparent" stroke="#87ceeb" stroke-width="2" />
+    <path transform="translate(10,10)"
+      d="M10,145L13.933,145L17.865,145L21.798,145L25.731,145L29.663,145L33.596,145L37.529,145L41.461,145L45.394,145L49.326,145L53.259,145L57.192,145L61.124,145L65.057,145L68.99,145L72.922,145L76.855,145L80.788,145L84.72,145L88.653,145L92.586,145L96.518,145L100.451,145L104.384,145L108.316,145L112.249,145L116.182,145L120.114,145L124.047,145L127.979,145L131.912,145L135.845,145L139.777,145L143.71,145L147.643,145L151.575,145L155.508,145L159.441,145L163.373,145L167.306,145L171.239,145L175.171,145L179.104,145L183.037,145L186.969,145L190.902,145L194.835,145L198.767,145L202.7,145L206.632,145L210.565,145L214.498,145L218.43,145L222.363,145L226.296,145L230.228,145L234.161,145L238.094,145L242.026,145L245.959,145L249.892,145L253.824,145L269.555,145L273.488,145L277.42,145L281.353,145L285.285,145L289.218,145L293.151,145L297.083,145L301.016,145L304.949,145L308.881,145L312.814,145L316.747,145L320.679,145L324.612,145L328.545,145L332.477,145L336.41,145L340.343,145L344.275,145L348.208,145L352.141,145L356.073,145L360.006,145L363.938,145L367.871,145L371.804,145L375.736,145L379.669,145L383.602,145L387.534,145L391.467,145L395.4,145L399.332,145L403.265,145L407.198,145L411.13,145L415.063,145L418.996,145L422.928,145L426.861,145L430.794,145L434.726,145L438.659,145L442.591,145L446.524,145L450.457,145L454.389,145L458.322,145L460,145L460,22.663L458.322,21.07L454.389,20.114L450.457,26.167L446.524,26.326L442.591,25.052L438.659,41.619L434.726,55.477L430.794,55.795L426.861,53.088L422.928,50.857L418.996,56.154L415.063,53.725L411.13,48.468L407.198,54.68L403.265,51.654L399.332,45.919L395.4,52.769L391.467,43.371L387.534,27.76L383.602,20.432L379.669,28.397L375.736,16.37L371.804,24.096L367.871,31.742L363.938,28.238L360.006,25.211L356.073,21.229L352.141,20.273L348.208,21.229L344.275,28.079L340.343,21.866L336.41,10L332.477,28.716L328.545,42.255L324.612,42.574L320.679,38.353L316.747,56.592L312.814,47.831L308.881,49.742L304.949,46.399L301.016,49.264L297.083,29.194L293.151,18.68L289.218,47.671L285.285,35.565L281.353,65.035L277.42,63.92L273.488,72.841L269.555,59.778L253.824,119.513L249.892,124.451L245.959,117.872L242.026,122.062L238.094,124.427L234.161,131.46L230.228,132.734L226.296,133.212L222.363,125.566L218.43,128.752L214.498,128.433L210.565,134.009L206.632,131.938L202.7,136.08L198.767,139.903L194.835,132.575L190.902,126.203L186.969,142.451L183.037,138.15L179.104,140.062L175.171,145L171.239,130.345L167.306,124.292L163.373,127.318L159.441,116.009L155.508,119.672L151.575,124.77L147.643,127.159L143.71,130.345L139.777,133.531L135.845,122.221L131.912,114.097L127.979,101.831L124.047,112.663L120.114,104.858L116.182,96.893L112.249,106.292L108.316,102.787L104.384,99.123L100.451,95.778L96.518,94.663L92.586,84.309L88.653,96.893L84.72,84.15L80.788,82.398L76.855,78.415L72.922,72.999L68.99,65.831L65.057,66.468L61.124,66.468L57.192,63.601L53.259,63.442L49.326,61.212L45.394,56.911L41.461,59.778L37.529,63.123L33.596,65.672L29.663,63.123L25.731,64.238L21.798,60.574L17.865,65.512L13.933,65.035L10,71.088Z"
+      fill="rgba(88, 166, 255, .1)" />
+  </svg>
 </div>
\ No newline at end of file
diff --git a/source/plugins/community/stock/index.mjs b/source/plugins/community/stock/index.mjs
index 3d20489e3a1..5bf1e2cc890 100644
--- a/source/plugins/community/stock/index.mjs
+++ b/source/plugins/community/stock/index.mjs
@@ -31,17 +31,7 @@ export default async function({login, q, imports, data, account}, {enabled = fal
 
     //Generating chart
     console.debug(`metrics/compute/${login}/plugins > stock > generating chart`)
-    const chart = await imports.chartist("line", {
-      width: 480 * (1 + data.large),
-      height: 160,
-      showPoint: false,
-      axisX: {showGrid: false, labelInterpolationFnc: (value, index) => index % Math.floor(close.length / 4) === 0 ? value : null},
-      axisY: {scaleMinSpace: 20},
-      showArea: true,
-    }, {
-      labels: timestamp.map(timestamp => new Intl.DateTimeFormat("en-GB", {month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit"}).format(new Date(timestamp * 1000))),
-      series: [close],
-    })
+    const chart = imports.Graph.timeline(close.map((y, i) => ({x:new Date(timestamp[i]*1000), y})), {low:Math.min(...close), high:Math.max(...close), points:false, text:false, width: 480 * (1 + data.large), height:200})
 
     //Results
     return {chart, currency, price, previous, delta: price - previous, symbol, company, interval, duration}
diff --git a/source/plugins/community/stock/metadata.yml b/source/plugins/community/stock/metadata.yml
index 29f53a0539e..108e2c9347e 100644
--- a/source/plugins/community/stock/metadata.yml
+++ b/source/plugins/community/stock/metadata.yml
@@ -19,7 +19,7 @@ inputs:
     type: boolean
     default: no
     extras:
-      - metrics.npm.optional.chartist
+      - metrics.npm.optional.d3
       - metrics.api.yahoo.finance
 
   plugin_stock_token:

From b2d9cdc245d7ff0818c33c5d716576ff564e01fc Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 15 Mar 2023 19:15:48 -0400
Subject: [PATCH 106/196] feat(plugins/habits): migrate to d3

---
 source/plugins/habits/index.mjs    | 59 ++++++++----------------------
 source/plugins/habits/metadata.yml |  7 +++-
 2 files changed, 21 insertions(+), 45 deletions(-)

diff --git a/source/plugins/habits/index.mjs b/source/plugins/habits/index.mjs
index c266e356225..89e379c8a60 100644
--- a/source/plugins/habits/index.mjs
+++ b/source/plugins/habits/index.mjs
@@ -106,60 +106,33 @@ export default async function({login, data, rest, imports, q, account}, {enabled
       if (patches.length) {
         //Call language analyzer (note: using content from other plugin is usually disallowed, this is mostly for legacy purposes)
         habits.linguist.available = true
-        const {total, stats} = await recent_analyzer({login, data, imports, rest, account}, {days, load: from || 1000, tempdir: "habits"})
+        const {total, stats, colors} = await recent_analyzer({login, data, imports, rest, account}, {days, load: from || 1000, tempdir: "habits"})
         habits.linguist.languages = Object.fromEntries(Object.entries(stats).map(([language, value]) => [language, value / total]))
         habits.linguist.ordered = Object.entries(habits.linguist.languages).sort(([_an, a], [_bn, b]) => b - a).filter(([_, value]) => value > threshold).slice(0, limit || Infinity)
+        habits.linguist.colors = colors
       }
       else {
         console.debug(`metrics/compute/${login}/plugins > habits > linguist not available`)
       }
     }
 
-    //Generating charts with chartist
-    if ((_charts === "chartist") && (imports.metadata.plugins.habits.extras("charts.type", {extras}))) {
+    //Generating charts
+    if ((["graph", "chartist"].includes(_charts)) && (imports.metadata.plugins.habits.extras("charts.type", {extras}))) {
       console.debug(`metrics/compute/${login}/plugins > habits > generating charts`)
       habits.charts = await Promise.all([
-        {type: "line", data: {...empty(24), ...Object.fromEntries(Object.entries(habits.commits.hours).filter(([k]) => !Number.isNaN(+k)))}, low: 0, high: habits.commits.hours.max},
-        {type: "line", data: {...empty(7), ...Object.fromEntries(Object.entries(habits.commits.days).filter(([k]) => !Number.isNaN(+k)))}, low: 0, high: habits.commits.days.max, labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], half: true},
-        {type: "pie", data: habits.linguist.languages, half: true},
-      ].map(({type, data, high, low, ref, labels = {}, half = false}) => {
-        const options = {
-          width: 480 * (half ? 0.45 : 1),
-          height: 160,
-          fullWidth: true,
-        }
-        const values = {
-          labels: Object.keys(data).map(key => labels[key] ?? key),
-          series: Object.values(data),
-        }
-        if (type === "line") {
-          Object.assign(options, {
-            showPoint: true,
-            axisX: {showGrid: false},
-            axisY: {showLabel: false, offset: 20, labelInterpolationFnc: value => imports.format(value), high, low, referenceValue: ref},
-            showArea: true,
-          })
-          Object.assign(values, {
-            series: [Object.values(data)],
-          })
-        }
-        return imports.chartist(type, options, values)
+        {type: "line", data: {...empty(24), ...Object.fromEntries(Object.entries(habits.commits.hours).filter(([k]) => !Number.isNaN(+k)))}, ticks:24, low: 0, high: habits.commits.hours.max},
+        {type: "line", data: {...empty(7), ...Object.fromEntries(Object.entries(habits.commits.days).filter(([k]) => !Number.isNaN(+k)))}, ticks:7, low: 0, high: habits.commits.days.max, labels:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], half: true},
+        {type: "pie", data: Object.fromEntries(Object.entries(habits.linguist.languages).map(([k, v]) => [k, (100*v).toFixed(2)])), colors:habits.linguist.colors, half: true},
+      ].map(({type, data, high, low, ticks, colors = null, labels = null, half = false}) => {
+        const width = 480 * (half ? 0.45 : 1)
+        const height = 160
+        if (type === "line") 
+          return imports.Graph.line(Object.entries(data).map(([x, y]) => ({x:+x, y})), {low, high, ticks, labels, width, height})
+        console.log(data)
+        if (type === "pie")
+          return imports.Graph.pie(data, {colors, width, height})
+        return ""
       }))
-      data.postscripts.push(`(${function(format) {
-        document.querySelectorAll(".habits .chartist").forEach(chart => {
-          chart.querySelectorAll(".habits .chartist .ct-point").forEach(node => {
-            const [x, y, value] = ["x1", "y1", "ct:value"].map(attribute => node.getAttribute(attribute))
-            if (Number(value)) {
-              const text = document.createElementNS("http://www.w3.org/2000/svg", "text")
-              text.setAttributeNS(null, "x", x)
-              text.setAttributeNS(null, "y", y - 5)
-              text.setAttributeNS(null, "class", "ct-post")
-              text.appendChild(document.createTextNode(format(value)))
-              node.parentNode.append(text)
-            }
-          })
-        })
-      }})(${imports.format.toString()})`)
     }
 
     //Results
diff --git a/source/plugins/habits/metadata.yml b/source/plugins/habits/metadata.yml
index 2b028e19ba0..dcdb3a95185 100644
--- a/source/plugins/habits/metadata.yml
+++ b/source/plugins/habits/metadata.yml
@@ -74,14 +74,17 @@ inputs:
       Charts display type
 
       - `classic`: `<div>` based charts, simple and lightweight
-      - `chartist`: `<svg>` based charts, smooth
+      - `graph`: `<svg>` based charts, smooth
+
+      > ⚠️ `chartist` option has been deprecated and is now equivalent to `graph`
     type: string
     default: classic
     values:
       - classic
+      - graph
       - chartist
     extras:
-      - metrics.npm.optional.chartist
+      - metrics.npm.optional.d3
 
   plugin_habits_trim:
     description: |

From a9e442c3dad613c3652bf4adc4878910ce6aee0d Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 15 Mar 2023 19:16:22 -0400
Subject: [PATCH 107/196] feat(plugins/stargazers): add
 `plugin_stargazers_days` and migrate to d3

---
 source/plugins/stargazers/examples.yml        |  6 +--
 source/plugins/stargazers/index.mjs           | 44 +++++--------------
 source/plugins/stargazers/metadata.yml        | 19 ++++++--
 source/templates/classic/partials/habits.ejs  |  6 +--
 .../templates/classic/partials/stargazers.ejs |  4 +-
 source/templates/classic/style.css            |  9 ----
 .../repository/partials/stargazers.ejs        |  6 +--
 tests/cases/stargazers.plugin.yml             |  4 +-
 8 files changed, 39 insertions(+), 59 deletions(-)

diff --git a/source/plugins/stargazers/examples.yml b/source/plugins/stargazers/examples.yml
index 030a3c5174f..18cc20568bd 100644
--- a/source/plugins/stargazers/examples.yml
+++ b/source/plugins/stargazers/examples.yml
@@ -6,14 +6,14 @@
     base: ""
     plugin_stargazers: yes
 
-- name: Using chartist charts
+- name: Using graph charts
   uses: lowlighter/metrics@latest
   with:
-    filename: metrics.plugin.stargazers.chartist.svg
+    filename: metrics.plugin.stargazers.graph.svg
     token: ${{ secrets.METRICS_TOKEN }}
     base: ""
     plugin_stargazers: yes
-    plugin_stargazers_charts_type: chartist
+    plugin_stargazers_charts_type: graph
 
 - name: With worldmap
   uses: lowlighter/metrics@latest
diff --git a/source/plugins/stargazers/index.mjs b/source/plugins/stargazers/index.mjs
index 2316e4fd353..bfe03f83398 100644
--- a/source/plugins/stargazers/index.mjs
+++ b/source/plugins/stargazers/index.mjs
@@ -7,7 +7,11 @@ export default async function({login, graphql, data, imports, q, queries, accoun
       return null
 
     //Load inputs
-    let {charts: _charts, "charts.type": _charts_type, worldmap: _worldmap, "worldmap.sample": _worldmap_sample} = imports.metadata.plugins.stargazers.inputs({data, account, q})
+    let {days, charts: _charts, "charts.type": _charts_type, worldmap: _worldmap, "worldmap.sample": _worldmap_sample} = imports.metadata.plugins.stargazers.inputs({data, account, q})
+    if (!days) {
+      days = Math.abs(parseInt((new Date() - new Date(data.user.createdAt))/1000/60/60/24))
+      console.debug(`metrics/compute/${login}/plugins > stargazers > set days to ${days}`)
+    }
 
     //Retrieve stargazers from graphql api
     console.debug(`metrics/compute/${login}/plugins > stargazers > querying api`)
@@ -34,7 +38,6 @@ export default async function({login, graphql, data, imports, q, queries, accoun
     console.debug(`metrics/compute/${login}/plugins > stargazers > loaded ${dates.length} stargazers in total`)
 
     //Compute stargazers increments
-    const days = 14 * (1 + data.large / 2)
     const increments = {dates: Object.fromEntries([...new Array(days).fill(null).map((_, i) => [new Date(Date.now() - i * 24 * 60 * 60 * 1000).toISOString().slice(0, 10), 0]).reverse()]), max: NaN, min: NaN}
     dates
       .map(date => date.toISOString().slice(0, 10))
@@ -62,40 +65,13 @@ export default async function({login, graphql, data, imports, q, queries, accoun
 
     //Generating charts
     let charts = _charts ? true : null
-    if ((_charts_type === "chartist") && (imports.metadata.plugins.stargazers.extras("charts.type", {extras}))) {
+    if ((["graph", "chartist"].includes(_charts_type)) && (imports.metadata.plugins.stargazers.extras("charts.type", {extras})))  {
       console.debug(`metrics/compute/${login}/plugins > stargazers > generating charts`)
-      charts = await Promise.all([{data: total, low: total.min, high: total.max}, {data: increments, ref: 0, low: increments.min, high: increments.max, sign: true}].map(({data: {dates: set}, high, low, ref, sign = false}) =>
-        imports.chartist("line", {
-          width: 480 * (1 + data.large),
-          height: 160,
-          showPoint: true,
-          axisX: {showGrid: false},
-          axisY: {showLabel: false, offset: 20, labelInterpolationFnc: value => imports.format(value, {sign}), high, low, referenceValue: ref},
-          showArea: true,
-          fullWidth: true,
-        }, {
-          labels: Object.keys(set).map((date, i, a) => {
-            const day = date.substring(date.length - 2)
-            if ((i === 0) || ((a[i - 1]) && (date.substring(0, 7) !== a[i - 1].substring(0, 7))))
-              return `${day} ${months[Number(date.substring(5, 7))]}`
-            return day
-          }),
-          series: [Object.values(set)],
+      charts = await Promise.all([{data: total, low: total.min, high: total.max}, {data: increments, low: 0, high: increments.max, sign: true}].map(({data: {dates: set}, low, high, sign = false}) => 
+        imports.Graph.timeline(Object.entries(set).map(([x, y]) => ({x:new Date(x), y, text:imports.format(y, {sign})})), {low, high,
+          match:(data, ticks) => data.filter(([x]) => ticks.map(t => t.toISOString().slice(0, 10)).includes(x.toISOString().slice(0, 10))),
         })
       ))
-      data.postscripts.push(`(${function(format) {
-        document.querySelectorAll(".stargazers .chartist").forEach((chart, sign) => {
-          chart.querySelectorAll(".stargazers .chartist .ct-point").forEach(node => {
-            const [x, y, value] = ["x1", "y1", "ct:value"].map(attribute => node.getAttribute(attribute))
-            const text = document.createElementNS("http://www.w3.org/2000/svg", "text")
-            text.setAttributeNS(null, "x", x)
-            text.setAttributeNS(null, "y", y - 5)
-            text.setAttributeNS(null, "class", "ct-post")
-            text.appendChild(document.createTextNode(format(value, {sign})))
-            node.parentNode.append(text)
-          })
-        })
-      }})(${imports.format.toString()})`)
     }
 
     //Generating worldmap
@@ -106,7 +82,7 @@ export default async function({login, graphql, data, imports, q, queries, accoun
     }
 
     //Results
-    return {total, increments, months, charts, worldmap}
+    return {total, increments, months, charts, worldmap, days}
   }
   //Handle errors
   catch (error) {
diff --git a/source/plugins/stargazers/metadata.yml b/source/plugins/stargazers/metadata.yml
index 670705c0d16..b49166fc3cb 100644
--- a/source/plugins/stargazers/metadata.yml
+++ b/source/plugins/stargazers/metadata.yml
@@ -4,7 +4,7 @@ description: |
   This plugin displays stargazers evolution across affiliated repositories.
 examples:
   +classic charts: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.svg
-  chartist charts: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.chartist.svg
+  graph charts: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.graph.svg
   +worldmap: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.worldmap.svg
 index: 2
 supports:
@@ -21,6 +21,16 @@ inputs:
     type: boolean
     default: no
 
+  plugin_stargazers_days:
+    description: |
+      Time range
+
+      If set to `0` the account registration date will be used.
+    type: number
+    min: 0
+    zero: see description
+    default: 14
+
   plugin_stargazers_charts:
     description: |
       Charts
@@ -34,14 +44,17 @@ inputs:
       Charts display type
 
       - `classic`: `<div>` based charts, simple and lightweight
-      - `chartist`: `<svg>` based charts, smooth
+      - `graph`: `<svg>` based charts, smooth
+
+      > ⚠️ `chartist` option has been deprecated and is now equivalent to `graph`
     type: string
     default: classic
     values:
       - classic
+      - graph
       - chartist
     extras:
-      - metrics.npm.optional.chartist
+      - metrics.npm.optional.d3
 
   plugin_stargazers_worldmap:
     description: |
diff --git a/source/templates/classic/partials/habits.ejs b/source/templates/classic/partials/habits.ejs
index 1ae66d8a00e..41c5c3bb169 100644
--- a/source/templates/classic/partials/habits.ejs
+++ b/source/templates/classic/partials/habits.ejs
@@ -42,7 +42,7 @@
         <div class="column chart largeable">
           <h3>Commit activity per hour of day</h3>
           <% if (Array.isArray(plugins.habits.charts)) { %>
-            <div class="row margin-bottom chartist">
+            <div class="row margin-bottom">
               <%- plugins.habits.charts[0] %>
             </div>
           <% } else { %>
@@ -72,7 +72,7 @@
           <section class="column chart">
             <h3>Commit activity per day of week</h3>
             <% if (Array.isArray(plugins.habits.charts)) { %>
-              <div class="margin-bottom chartist">
+              <div class="margin-bottom">
                 <%- plugins.habits.charts[1] %>
               </div>
             <% } else { %>
@@ -92,7 +92,7 @@
           <section class="column chart">
             <h3>Language activity</h3>
             <% if (Array.isArray(plugins.habits.charts)) { %>
-              <div class="margin-bottom chartist">
+              <div class="margin-bottom">
                 <%- plugins.habits.charts[2] %>
               </div>
             <% } else { %>
diff --git a/source/templates/classic/partials/stargazers.ejs b/source/templates/classic/partials/stargazers.ejs
index 61faa095fc7..baba45354cd 100644
--- a/source/templates/classic/partials/stargazers.ejs
+++ b/source/templates/classic/partials/stargazers.ejs
@@ -12,7 +12,7 @@
     <% } else { %>
       <% if (plugins.stargazers.charts) { %>
         <div class="row margin-bottom">
-          <section class="column chart chartist">
+          <section class="column chart">
             <h3>Total stargazers</h3>
             <% if (Array.isArray(plugins.stargazers.charts)) { %>
               <%- plugins.stargazers.charts[0] %>
@@ -31,7 +31,7 @@
               </div>
             <% } %>
           </section>
-          <section class="column chart chartist">
+          <section class="column chart">
             <h3>New stargazers per day</h3>
             <% if (Array.isArray(plugins.stargazers.charts)) { %>
               <%- plugins.stargazers.charts[1] %>
diff --git a/source/templates/classic/style.css b/source/templates/classic/style.css
index 2215d1ed8b1..441efa65758 100644
--- a/source/templates/classic/style.css
+++ b/source/templates/classic/style.css
@@ -356,15 +356,6 @@
     padding-left: 37px;
   }
 
-/* Chartist */
-/* purgecss ignore */
-  .chartist .ct-post {
-    fill: rgba(127, 127, 127, 0.8) !important;
-    color: rgba(127, 127, 127, 0.8) !important;
-    font-size: 9px;
-    text-anchor: middle;
-  }
-
 /* Footer */
   footer {
     margin-top: 8px;
diff --git a/source/templates/repository/partials/stargazers.ejs b/source/templates/repository/partials/stargazers.ejs
index 7917bfde050..e355284b277 100644
--- a/source/templates/repository/partials/stargazers.ejs
+++ b/source/templates/repository/partials/stargazers.ejs
@@ -2,7 +2,7 @@
   <section class="stargazers">
     <h2 class="field">
       <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M8 .25a.75.75 0 01.673.418l1.882 3.815 4.21.612a.75.75 0 01.416 1.279l-3.046 2.97.719 4.192a.75.75 0 01-1.088.791L8 12.347l-3.766 1.98a.75.75 0 01-1.088-.79l.72-4.194L.818 6.374a.75.75 0 01.416-1.28l4.21-.611L7.327.668A.75.75 0 018 .25zm0 2.445L6.615 5.5a.75.75 0 01-.564.41l-3.097.45 2.24 2.184a.75.75 0 01.216.664l-.528 3.084 2.769-1.456a.75.75 0 01.698 0l2.77 1.456-.53-3.084a.75.75 0 01.216-.664l2.24-2.183-3.096-.45a.75.75 0 01-.564-.41L8 2.694v.001z"></path></svg>
-      Stargazers over the last two weeks
+      Stargazers
     </h2>
     <% if (plugins.stargazers.error) { %>
       <div class="field error">
@@ -11,7 +11,7 @@
       </div>
     <% } else { %>
       <div class="row margin-bottom">
-        <section class="column chart chartist">
+        <section class="column chart">
           <h3>Total stargazers</h3>
           <% if (plugins.stargazers.charts) { %>
             <%- plugins.stargazers.charts[0] %>
@@ -30,7 +30,7 @@
             </div>
           <% } %>
         </section>
-        <section class="column chart chartist">
+        <section class="column chart">
           <h3>New stargazers per day</h3>
           <% if (plugins.stargazers.charts) { %>
             <%- plugins.stargazers.charts[1] %>
diff --git a/tests/cases/stargazers.plugin.yml b/tests/cases/stargazers.plugin.yml
index f0e669f4bf6..8d24aaca4f2 100644
--- a/tests/cases/stargazers.plugin.yml
+++ b/tests/cases/stargazers.plugin.yml
@@ -5,12 +5,12 @@
     plugin_stargazers: 'yes'
     use_mocked_data: 'yes'
     verify: 'yes'
-- name: ✨ Stargazers - Using chartist charts
+- name: ✨ Stargazers - Using graph charts
   uses: lowlighter/metrics@latest
   with:
     token: MOCKED_TOKEN
     plugin_stargazers: 'yes'
-    plugin_stargazers_charts_type: chartist
+    plugin_stargazers_charts_type: graph
     use_mocked_data: 'yes'
     verify: 'yes'
 - name: ✨ Stargazers - With worldmap

From ba8e9715797c05c5b0a3e3d7d4cc2d94b3bb99e0 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 15 Mar 2023 19:17:12 -0400
Subject: [PATCH 108/196] ci: update examples.yml

---
 .github/workflows/examples.yml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 91c96114dfe..62456567c23 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -234,14 +234,14 @@ jobs:
           user: lowlighter
           plugins_errors_fatal: yes
         if: ${{ success() || failure() }}
-      - name: ✨ Stargazers - Using chartist charts
+      - name: ✨ Stargazers - Using graph charts
         uses: lowlighter/metrics@master
         with:
-          filename: metrics.plugin.stargazers.chartist.svg
+          filename: metrics.plugin.stargazers.graph.svg
           token: ${{ secrets.METRICS_TOKEN }}
           base: ""
           plugin_stargazers: yes
-          plugin_stargazers_charts_type: chartist
+          plugin_stargazers_charts_type: graph
           output_action: none
           delay: 120
           user: lowlighter

From be87f305b78018f29b88ed56a8095da8ec3140c8 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 15 Mar 2023 19:27:29 -0400
Subject: [PATCH 109/196] fix(utils): chart color

---
 source/app/metrics/utils.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 621783d5d95..83df258ea25 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -925,7 +925,7 @@ export const Graph = {
         .attr("text-anchor", "middle")
         .attr("font-family", "sans-serif")
         .attr("font-size", 10)
-        .attr("stroke", "white")
+        .attr("stroke", "rgba(88, 166, 255, .05)")
         .attr("stroke-linejoin", "round")
         .attr("stroke-width", 4)
         .attr("paint-order", "stroke fill")

From 479e6e9a875e79ba17d43dd26e434cb9269a4222 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 15 Mar 2023 19:35:06 -0400
Subject: [PATCH 110/196] ci: update lines example

---
 .github/workflows/examples.yml    | 5 +++++
 source/plugins/lines/examples.yml | 7 ++++++-
 tests/cases/lines.plugin.yml      | 5 +++++
 3 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 62456567c23..4d597531874 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -285,6 +285,11 @@ jobs:
           plugin_lines_sections: repositories, history
           plugin_lines_repositories_limit: 2
           plugin_lines_history_limit: 1
+          repositories_skipped: |
+            @use.patterns
+            */*
+            +lowlighter/metrics
+            +lowlighter/brain
           output_action: none
           delay: 120
           user: lowlighter
diff --git a/source/plugins/lines/examples.yml b/source/plugins/lines/examples.yml
index 9879fed2b11..d08c816f424 100644
--- a/source/plugins/lines/examples.yml
+++ b/source/plugins/lines/examples.yml
@@ -15,4 +15,9 @@
     plugin_lines: yes
     plugin_lines_sections: repositories, history
     plugin_lines_repositories_limit: 2
-    plugin_lines_history_limit: 1
\ No newline at end of file
+    plugin_lines_history_limit: 1
+    repositories_skipped: |
+      @use.patterns
+      */*
+      +lowlighter/metrics
+      +lowlighter/brain
diff --git a/tests/cases/lines.plugin.yml b/tests/cases/lines.plugin.yml
index bc13cf0b2e3..f824b141ccb 100644
--- a/tests/cases/lines.plugin.yml
+++ b/tests/cases/lines.plugin.yml
@@ -14,5 +14,10 @@
     plugin_lines_sections: repositories, history
     plugin_lines_repositories_limit: 2
     plugin_lines_history_limit: 1
+    repositories_skipped: |
+      @use.patterns
+      */*
+      +lowlighter/metrics
+      +lowlighter/brain
     use_mocked_data: 'yes'
     verify: 'yes'

From 566ee2075b3d9a5c34d2ecf794c3a576e5a8d42e Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 15 Mar 2023 19:42:53 -0400
Subject: [PATCH 111/196] fix: linter

---
 .github/actions/spelling/allow.txt  |  6 ++++++
 source/app/metrics/utils.mjs        | 20 ++++++++++----------
 source/plugins/habits/index.mjs     |  2 +-
 source/plugins/stargazers/index.mjs |  2 +-
 4 files changed, 18 insertions(+), 12 deletions(-)

diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index f5742471cc9..538a712fc0c 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -18,6 +18,7 @@ npx
 personaname
 pgn
 playerstats
+rbga
 rtime
 scm
 shas
@@ -30,9 +31,14 @@ steamcommunity
 steamid
 steamids
 steampowered
+tdatum
 timecreated
+tspan
 ubuntu
 unlocktime
 userid
+xticked
+xticks
 yargsparser
+yticked
 webtoken
diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 83df258ea25..97dff699031 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -809,7 +809,7 @@ export class D3node {
   }
 }
 
-/** Graph utilities */
+/**Graph utilities */
 export const Graph = {
   /**Timeline graph */
   timeline() {
@@ -825,7 +825,7 @@ export const Graph = {
     const margin = {top:10, left:10, right:10, bottom:45}
     const d3n = new D3node()
     const svg = d3n.createSVG(width, height)
-  
+
     //Data
     const X = data.map(({x}) => x)
     const start = X.at(0)
@@ -855,7 +855,7 @@ export const Graph = {
       .style("text-anchor", "end")
       .style("font-size", 20)
       .attr("fill", "rgba(127, 127, 127, .8)")
-  
+
     //Data range
     const y = d3.scaleLinear()
       .domain([high, low])
@@ -869,7 +869,7 @@ export const Graph = {
       .selectAll("text")
       .style("font-size", 20)
       .attr("fill", "rgba(127, 127, 127, .8)")
-  
+
     //Generate graph line
     const datum = Y.map((y, i) => [X.at(i), y])
     const tdatum = Y.map((y, i) => [X.at(i), y, T[i]])
@@ -888,7 +888,7 @@ export const Graph = {
       .attr("fill", "transparent")
       .attr("stroke", "#87ceeb")
       .attr("stroke-width", 2)
-    
+
     //Generate graph area
     if (area) {
       svg.append("path")
@@ -904,7 +904,7 @@ export const Graph = {
       )
       .attr("fill", "rgba(88, 166, 255, .1)")
     }
-  
+
     //Generate graph points
     if (points) {
       svg.append("g")
@@ -917,7 +917,7 @@ export const Graph = {
         .attr("r", 2)
         .attr("fill", "#106cbc")
     }
-  
+
     //Generate graph text
     if (text) {
       svg.append("g")
@@ -938,7 +938,7 @@ export const Graph = {
         .text(d => d[2] ? d[2] : "")
         .attr("fill", "rgba(127, 127, 127, .8)")
     }
-  
+
     return d3n.svgString()
   },
   /**Pie Graph */
@@ -947,7 +947,7 @@ export const Graph = {
     const radius = Math.min(width, height) / 2
     const d3n = new D3node()
     const svg = d3n.createSVG(width, height)
-  
+
     //Data
     const K = Object.keys(data)
     const V = Object.values(data)
@@ -958,7 +958,7 @@ export const Graph = {
     const arcs = d3.pie().padAngle(1/radius).sort(null).value(i => V[i])(I)
     const arc = d3.arc().innerRadius(0).outerRadius(radius)
     const labels = d3.arc().innerRadius(radius/2).outerRadius(radius/2)
-  
+
     svg.append("g")
       .attr("transform", `translate(${width/2},${height/2})`)
       .attr("stroke", "white")
diff --git a/source/plugins/habits/index.mjs b/source/plugins/habits/index.mjs
index 89e379c8a60..2626580bd59 100644
--- a/source/plugins/habits/index.mjs
+++ b/source/plugins/habits/index.mjs
@@ -126,7 +126,7 @@ export default async function({login, data, rest, imports, q, account}, {enabled
       ].map(({type, data, high, low, ticks, colors = null, labels = null, half = false}) => {
         const width = 480 * (half ? 0.45 : 1)
         const height = 160
-        if (type === "line") 
+        if (type === "line")
           return imports.Graph.line(Object.entries(data).map(([x, y]) => ({x:+x, y})), {low, high, ticks, labels, width, height})
         console.log(data)
         if (type === "pie")
diff --git a/source/plugins/stargazers/index.mjs b/source/plugins/stargazers/index.mjs
index bfe03f83398..21a356897dc 100644
--- a/source/plugins/stargazers/index.mjs
+++ b/source/plugins/stargazers/index.mjs
@@ -67,7 +67,7 @@ export default async function({login, graphql, data, imports, q, queries, accoun
     let charts = _charts ? true : null
     if ((["graph", "chartist"].includes(_charts_type)) && (imports.metadata.plugins.stargazers.extras("charts.type", {extras})))  {
       console.debug(`metrics/compute/${login}/plugins > stargazers > generating charts`)
-      charts = await Promise.all([{data: total, low: total.min, high: total.max}, {data: increments, low: 0, high: increments.max, sign: true}].map(({data: {dates: set}, low, high, sign = false}) => 
+      charts = await Promise.all([{data: total, low: total.min, high: total.max}, {data: increments, low: 0, high: increments.max, sign: true}].map(({data: {dates: set}, low, high, sign = false}) =>
         imports.Graph.timeline(Object.entries(set).map(([x, y]) => ({x:new Date(x), y, text:imports.format(y, {sign})})), {low, high,
           match:(data, ticks) => data.filter(([x]) => ticks.map(t => t.toISOString().slice(0, 10)).includes(x.toISOString().slice(0, 10))),
         })

From 6de9c47ec407f438e165c25ab541f6f2c73a28d6 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 15 Mar 2023 19:46:23 -0400
Subject: [PATCH 112/196] chore: update package-lock.json

---
 package-lock.json | 1269 +--------------------------------------------
 1 file changed, 27 insertions(+), 1242 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 898beb1c4ef..b8c5b40f9eb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -60,7 +60,6 @@
         "color": "^4.2.3",
         "gifencoder": "^2.0.1",
         "libxmljs2": "^0.31.0",
-        "node-chartist": "^1.0.5",
         "rss": "^1.2.2",
         "yargs-parser": "^21.1.1"
       }
@@ -1896,22 +1895,6 @@
         "@octokit/openapi-types": "^12.11.0"
       }
     },
-    "node_modules/@panosoft/ramda-utils": {
-      "version": "0.2.8",
-      "resolved": "https://registry.npmjs.org/@panosoft/ramda-utils/-/ramda-utils-0.2.8.tgz",
-      "integrity": "sha512-lUou1P0vUiWt40AjhjYLwh0SN/3DNnsb+GM3xiqz6tPoMnv9+LjPxe7XYKKPcGnfqurtnUEJbkJR+RKed2/qiw==",
-      "optional": true,
-      "dependencies": {
-        "is_js": "^0.7.4",
-        "ramda": "^0.18.0"
-      }
-    },
-    "node_modules/@panosoft/ramda-utils/node_modules/is_js": {
-      "version": "0.7.6",
-      "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.7.6.tgz",
-      "integrity": "sha512-VEd4A7sAneA4qWlrwdTT3WyodlfpSXZIyMYNpf8SA4Q1zOH4+1O2X5LuARQGBqCUDpG9SxDHV03ZLNUIg3xS1g==",
-      "optional": true
-    },
     "node_modules/@primer/behaviors": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.3.tgz",
@@ -2251,7 +2234,7 @@
       "version": "6.12.6",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
       "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
-      "devOptional": true,
+      "dev": true,
       "dependencies": {
         "fast-deep-equal": "^3.1.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -2350,41 +2333,11 @@
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
       "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
     },
-    "node_modules/array-equal": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
-      "integrity": "sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==",
-      "optional": true
-    },
     "node_modules/array-flatten": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
       "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
     },
-    "node_modules/asap": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
-      "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
-      "optional": true
-    },
-    "node_modules/asn1": {
-      "version": "0.2.6",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
-      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
-      "optional": true,
-      "dependencies": {
-        "safer-buffer": "~2.1.0"
-      }
-    },
-    "node_modules/assert-plus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
-      "optional": true,
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
     "node_modules/async": {
       "version": "3.2.4",
       "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
@@ -2395,21 +2348,6 @@
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
-    "node_modules/aws-sign2": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
-      "optional": true,
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/aws4": {
-      "version": "1.12.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
-      "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
-      "optional": true
-    },
     "node_modules/axios": {
       "version": "1.3.4",
       "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
@@ -2535,15 +2473,6 @@
         }
       ]
     },
-    "node_modules/bcrypt-pbkdf": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
-      "optional": true,
-      "dependencies": {
-        "tweetnacl": "^0.14.3"
-      }
-    },
     "node_modules/before-after-hook": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
@@ -2656,21 +2585,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/brfs": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz",
-      "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==",
-      "optional": true,
-      "dependencies": {
-        "quote-stream": "^1.0.1",
-        "resolve": "^1.1.5",
-        "static-module": "^2.2.0",
-        "through2": "^2.0.0"
-      },
-      "bin": {
-        "brfs": "bin/cmd.js"
-      }
-    },
     "node_modules/browserslist": {
       "version": "4.21.5",
       "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
@@ -2739,20 +2653,11 @@
         "node": "*"
       }
     },
-    "node_modules/buffer-equal": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
-      "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
-      "optional": true,
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
     "node_modules/buffer-from": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
-      "devOptional": true
+      "dev": true
     },
     "node_modules/bytes": {
       "version": "3.0.0",
@@ -2847,12 +2752,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
-      "optional": true
-    },
     "node_modules/chalk": {
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -2882,24 +2781,6 @@
       "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.5.1.tgz",
       "integrity": "sha512-0XMOtA52igKDOIfvJZJ6v0+J9yMF3IuYyEa5oFUxBXA01G6mwCNKpul3bgbFf7lmZuqwN/oyg/zQ1cGS7NyJkQ=="
     },
-    "node_modules/chartist": {
-      "version": "0.11.4",
-      "resolved": "https://registry.npmjs.org/chartist/-/chartist-0.11.4.tgz",
-      "integrity": "sha512-H4AimxaUD738/u9Mq8t27J4lh6STsLi4BQHt65nOtpLk3xyrBPaLiLMrHw7/WV9CmsjGA02WihjuL5qpSagLYw==",
-      "optional": true,
-      "engines": {
-        "node": ">=4.6.0"
-      }
-    },
-    "node_modules/chartist-plugin-axistitle": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/chartist-plugin-axistitle/-/chartist-plugin-axistitle-0.0.1.tgz",
-      "integrity": "sha512-svUtzT1ZlrgmnKqJE81rxk403b9cS7KlEPLfclANpoA75+GRFXdZtlF/X94HMKo86I6gRAaE9laa2N6DKiCubA==",
-      "optional": true,
-      "engines": {
-        "node": ">=0.8.0"
-      }
-    },
     "node_modules/cheerio": {
       "version": "1.0.0-rc.12",
       "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
@@ -3019,7 +2900,7 @@
       "version": "4.6.0",
       "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
       "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
-      "devOptional": true,
+      "dev": true,
       "engines": {
         "iojs": ">= 1.0.0",
         "node": ">= 0.12.0"
@@ -3147,51 +3028,6 @@
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
       "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
     },
-    "node_modules/concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "engines": [
-        "node >= 0.8"
-      ],
-      "optional": true,
-      "dependencies": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      }
-    },
-    "node_modules/concat-stream/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "optional": true
-    },
-    "node_modules/concat-stream/node_modules/readable-stream": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-      "optional": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/concat-stream/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "optional": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
     "node_modules/console-control-strings": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
@@ -3236,12 +3072,6 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/content-type-parser": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.2.tgz",
-      "integrity": "sha512-lM4l4CnMEwOLHAHr/P6MEZwZFPJFtAAKgL6pogbXmVZggIqXhdB6RbBtPOTsw2FcXwYhehRGERJmRrjOiIB8pQ==",
-      "optional": true
-    },
     "node_modules/convert-source-map": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -3261,12 +3091,6 @@
       "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
       "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
     },
-    "node_modules/core-util-is": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
-      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
-      "optional": true
-    },
     "node_modules/cosmiconfig": {
       "version": "8.1.0",
       "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz",
@@ -3350,12 +3174,6 @@
       "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==",
       "optional": true
     },
-    "node_modules/css-mediaquery": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/css-mediaquery/-/css-mediaquery-0.1.2.tgz",
-      "integrity": "sha512-COtn4EROW5dBGlE/4PiKnh6rZpAPxDeFLaEEwt4i10jpDMFt2EhQGS79QmmrO+iKCHv0PU/HrOWEhijFd1x99Q==",
-      "optional": true
-    },
     "node_modules/css-select": {
       "version": "5.1.0",
       "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
@@ -3418,12 +3236,6 @@
         "npm": ">=7.0.0"
       }
     },
-    "node_modules/cssom": {
-      "version": "0.3.8",
-      "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
-      "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
-      "optional": true
-    },
     "node_modules/cssstyle": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-3.0.0.tgz",
@@ -3810,18 +3622,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
-      "optional": true,
-      "dependencies": {
-        "assert-plus": "^1.0.0"
-      },
-      "engines": {
-        "node": ">=0.10"
-      }
-    },
     "node_modules/data-uri-to-buffer": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
@@ -4101,55 +3901,6 @@
         "dprint": "bin.js"
       }
     },
-    "node_modules/duplexer2": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
-      "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
-      "optional": true,
-      "dependencies": {
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "node_modules/duplexer2/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "optional": true
-    },
-    "node_modules/duplexer2/node_modules/readable-stream": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-      "optional": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/duplexer2/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "optional": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/ecc-jsbn": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
-      "optional": true,
-      "dependencies": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
-      }
-    },
     "node_modules/ee-first": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -4654,12 +4405,6 @@
         }
       ]
     },
-    "node_modules/extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "optional": true
-    },
     "node_modules/extract-zip": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
@@ -4693,51 +4438,17 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
-      "engines": [
-        "node >=0.6.0"
-      ],
-      "optional": true
-    },
-    "node_modules/falafel": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz",
-      "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==",
-      "optional": true,
-      "dependencies": {
-        "acorn": "^7.1.1",
-        "isarray": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/falafel/node_modules/acorn": {
-      "version": "7.4.1",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-      "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
-      "optional": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
-      "devOptional": true
+      "dev": true
     },
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
       "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
-      "devOptional": true
+      "dev": true
     },
     "node_modules/fast-levenshtein": {
       "version": "2.0.6",
@@ -4950,15 +4661,6 @@
         }
       }
     },
-    "node_modules/forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
-      "optional": true,
-      "engines": {
-        "node": "*"
-      }
-    },
     "node_modules/form-data": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -5137,15 +4839,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
-      "optional": true,
-      "dependencies": {
-        "assert-plus": "^1.0.0"
-      }
-    },
     "node_modules/gifencoder": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz",
@@ -5273,29 +4966,6 @@
       "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
       "dev": true
     },
-    "node_modules/har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
-      "optional": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/har-validator": {
-      "version": "5.1.5",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
-      "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
-      "deprecated": "this library is no longer supported",
-      "optional": true,
-      "dependencies": {
-        "ajv": "^6.12.3",
-        "har-schema": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/has": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -5400,21 +5070,6 @@
         "node": ">= 6"
       }
     },
-    "node_modules/http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
-      "optional": true,
-      "dependencies": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      },
-      "engines": {
-        "node": ">=0.8",
-        "npm": ">=1.3.7"
-      }
-    },
     "node_modules/http2-wrapper": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
@@ -5573,12 +5228,6 @@
         "node": ">= 0.10"
       }
     },
-    "node_modules/is_js": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz",
-      "integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg==",
-      "optional": true
-    },
     "node_modules/is-arrayish": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
@@ -5588,7 +5237,7 @@
       "version": "2.11.0",
       "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
       "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
-      "devOptional": true,
+      "dev": true,
       "dependencies": {
         "has": "^1.0.3"
       },
@@ -5678,18 +5327,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
-      "optional": true
-    },
-    "node_modules/isarray": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
-      "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
-      "optional": true
-    },
     "node_modules/isbinaryfile": {
       "version": "4.0.10",
       "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
@@ -5707,12 +5344,6 @@
       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
       "dev": true
     },
-    "node_modules/isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
-      "optional": true
-    },
     "node_modules/istanbul-lib-coverage": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
@@ -6414,12 +6045,6 @@
         "js-yaml": "bin/js-yaml.js"
       }
     },
-    "node_modules/jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
-      "optional": true
-    },
     "node_modules/jsdom": {
       "version": "21.1.1",
       "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.1.tgz",
@@ -6486,17 +6111,11 @@
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
       "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
     },
-    "node_modules/json-schema": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
-      "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
-      "optional": true
-    },
     "node_modules/json-schema-traverse": {
       "version": "0.4.1",
       "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
       "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
-      "devOptional": true
+      "dev": true
     },
     "node_modules/json-stable-stringify-without-jsonify": {
       "version": "1.0.1",
@@ -6504,12 +6123,6 @@
       "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
       "dev": true
     },
-    "node_modules/json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
-      "optional": true
-    },
     "node_modules/json5": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -6522,21 +6135,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/jsprim": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
-      "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
-      "optional": true,
-      "dependencies": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.4.0",
-        "verror": "1.10.0"
-      },
-      "engines": {
-        "node": ">=0.6.0"
-      }
-    },
     "node_modules/keyv": {
       "version": "4.5.2",
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
@@ -6667,15 +6265,6 @@
         "yallist": "^3.0.2"
       }
     },
-    "node_modules/magic-string": {
-      "version": "0.22.5",
-      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
-      "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
-      "optional": true,
-      "dependencies": {
-        "vlq": "^0.2.2"
-      }
-    },
     "node_modules/make-dir": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
@@ -6728,15 +6317,6 @@
         "node": ">= 12"
       }
     },
-    "node_modules/matchmedia": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/matchmedia/-/matchmedia-0.1.2.tgz",
-      "integrity": "sha512-ylpxHN2LdORLPJ62MAMBS1aXgwJYg4RunqwtQfREaAW6AV8wuPKb+6Ab+oE96npCaW2hVHZSmh3eIjOaYc4Fkw==",
-      "optional": true,
-      "dependencies": {
-        "css-mediaquery": "^0.1.2"
-      }
-    },
     "node_modules/mdn-data": {
       "version": "2.0.28",
       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
@@ -6760,24 +6340,6 @@
       "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
       "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
     },
-    "node_modules/merge-source-map": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz",
-      "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==",
-      "optional": true,
-      "dependencies": {
-        "source-map": "^0.5.6"
-      }
-    },
-    "node_modules/merge-source-map/node_modules/source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
-      "optional": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/merge-stream": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
@@ -7006,269 +6568,22 @@
         "node": ">= 8.0.0"
       }
     },
-    "node_modules/node-chartist": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/node-chartist/-/node-chartist-1.0.5.tgz",
-      "integrity": "sha512-xtdGZRUlzoXx0UbctlFapEjFqubpcyksNTn6oNck3iE3d2oYqW4s2SH8LSyYpgYQqEe3qSdQW370K8P0WF2fNw==",
-      "optional": true,
-      "dependencies": {
-        "@panosoft/ramda-utils": "^0.2.8",
-        "brfs": "^1.4.3",
-        "chartist": "^0.11.0",
-        "chartist-plugin-axistitle": "0.0.1",
-        "co": "^4.6.0",
-        "is_js": "^0.9.0",
-        "jsdom": "^9.0.0",
-        "matchmedia": "^0.1.2",
-        "promisify-node": "^0.2.1",
-        "ramda": "^0.18.0",
-        "underscore.string": "^3.3.4"
-      }
-    },
-    "node_modules/node-chartist/node_modules/abab": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
-      "integrity": "sha512-I+Wi+qiE2kUXyrRhNsWv6XsjUTBJjSoVSctKNBfLG5zG/Xe7Rjbxf13+vqYHNTwHaFU+FtSlVxOCTiMEVtPv0A==",
-      "optional": true
-    },
-    "node_modules/node-chartist/node_modules/acorn": {
-      "version": "4.0.13",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
-      "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==",
-      "optional": true,
-      "bin": {
-        "acorn": "bin/acorn"
-      },
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/node-chartist/node_modules/acorn-globals": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
-      "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==",
-      "optional": true,
-      "dependencies": {
-        "acorn": "^4.0.4"
-      }
-    },
-    "node_modules/node-chartist/node_modules/cssstyle": {
-      "version": "0.2.37",
-      "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
-      "integrity": "sha512-FUpKc+1FNBsHUr9IsfSGCovr8VuGOiiuzlgCyppKBjJi2jYTOFLN3oiiNRMIvYqbFzF38mqKj4BgcevzU5/kIA==",
-      "optional": true,
-      "dependencies": {
-        "cssom": "0.3.x"
-      }
-    },
-    "node_modules/node-chartist/node_modules/escodegen": {
-      "version": "1.14.3",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
-      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
-      "optional": true,
-      "dependencies": {
-        "esprima": "^4.0.1",
-        "estraverse": "^4.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1"
-      },
-      "bin": {
-        "escodegen": "bin/escodegen.js",
-        "esgenerate": "bin/esgenerate.js"
-      },
-      "engines": {
-        "node": ">=4.0"
-      },
-      "optionalDependencies": {
-        "source-map": "~0.6.1"
-      }
-    },
-    "node_modules/node-chartist/node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "optional": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/node-chartist/node_modules/html-encoding-sniffer": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
-      "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
-      "optional": true,
-      "dependencies": {
-        "whatwg-encoding": "^1.0.1"
-      }
-    },
-    "node_modules/node-chartist/node_modules/iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "optional": true,
-      "dependencies": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/node-chartist/node_modules/jsdom": {
-      "version": "9.12.0",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.12.0.tgz",
-      "integrity": "sha512-Qw4oqNxo4LyzkSqVIyCnEltTc4xV3g1GBaI88AvYTesWzmWHUSoMNmhBjUBa+6ldXIBJS9xoeLNJPfUAykTyxw==",
-      "optional": true,
-      "dependencies": {
-        "abab": "^1.0.3",
-        "acorn": "^4.0.4",
-        "acorn-globals": "^3.1.0",
-        "array-equal": "^1.0.0",
-        "content-type-parser": "^1.0.1",
-        "cssom": ">= 0.3.2 < 0.4.0",
-        "cssstyle": ">= 0.2.37 < 0.3.0",
-        "escodegen": "^1.6.1",
-        "html-encoding-sniffer": "^1.0.1",
-        "nwmatcher": ">= 1.3.9 < 2.0.0",
-        "parse5": "^1.5.1",
-        "request": "^2.79.0",
-        "sax": "^1.2.1",
-        "symbol-tree": "^3.2.1",
-        "tough-cookie": "^2.3.2",
-        "webidl-conversions": "^4.0.0",
-        "whatwg-encoding": "^1.0.1",
-        "whatwg-url": "^4.3.0",
-        "xml-name-validator": "^2.0.1"
-      }
-    },
-    "node_modules/node-chartist/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-      "optional": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/node-chartist/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "optional": true,
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/node-chartist/node_modules/parse5": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
-      "integrity": "sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==",
-      "optional": true
-    },
-    "node_modules/node-chartist/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
-      "optional": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/node-chartist/node_modules/tough-cookie": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-      "optional": true,
-      "dependencies": {
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/node-chartist/node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
-      "optional": true
-    },
-    "node_modules/node-chartist/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-      "optional": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/node-chartist/node_modules/webidl-conversions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
-      "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
-      "optional": true
-    },
-    "node_modules/node-chartist/node_modules/whatwg-encoding": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
-      "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
-      "optional": true,
-      "dependencies": {
-        "iconv-lite": "0.4.24"
-      }
-    },
-    "node_modules/node-chartist/node_modules/whatwg-url": {
-      "version": "4.8.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz",
-      "integrity": "sha512-nUvUPuenPFtPfy/X+dAYh/TfRbTBlnXTM5iIfLseJFkkQewmpG9pGR6i87E9qL+lZaJzv+99kkQWoGOtLfkZQQ==",
-      "optional": true,
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
-    "node_modules/node-chartist/node_modules/whatwg-url/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
-      "optional": true
-    },
-    "node_modules/node-chartist/node_modules/xml-name-validator": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
-      "integrity": "sha512-jRKe/iQYMyVJpzPH+3HL97Lgu5HrCfii+qSo+TfjKHtOnvbnvdVfMYrn9Q34YV81M2e5sviJlI6Ko9y+nByzvA==",
-      "optional": true
-    },
-    "node_modules/node-domexception": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
-      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/jimmywarting"
-        },
-        {
-          "type": "github",
-          "url": "https://paypal.me/jimmywarting"
-        }
-      ],
-      "engines": {
-        "node": ">=10.5.0"
+    "node_modules/node-domexception": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
+      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/jimmywarting"
+        },
+        {
+          "type": "github",
+          "url": "https://paypal.me/jimmywarting"
+        }
+      ],
+      "engines": {
+        "node": ">=10.5.0"
       }
     },
     "node_modules/node-fetch": {
@@ -7300,15 +6615,6 @@
       "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
       "dev": true
     },
-    "node_modules/nodegit-promise": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/nodegit-promise/-/nodegit-promise-3.0.3.tgz",
-      "integrity": "sha512-g9xU8ORtPJFC+RfwU6xoXtZ024OLINsRSF1ihP75dIYNFfQJX/7yHaMaNo7WidRs9f/SC+0ZP47+kTRWwDQ+AA==",
-      "optional": true,
-      "dependencies": {
-        "asap": "~2.0.3"
-      }
-    },
     "node_modules/nopt": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
@@ -7379,26 +6685,11 @@
         "url": "https://github.com/fb55/nth-check?sponsor=1"
       }
     },
-    "node_modules/nwmatcher": {
-      "version": "1.4.4",
-      "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
-      "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
-      "optional": true
-    },
     "node_modules/nwsapi": {
       "version": "2.2.2",
       "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz",
       "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw=="
     },
-    "node_modules/oauth-sign": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "optional": true,
-      "engines": {
-        "node": "*"
-      }
-    },
     "node_modules/object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -7631,7 +6922,7 @@
       "version": "1.0.7",
       "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "devOptional": true
+      "dev": true
     },
     "node_modules/path-scurry": {
       "version": "1.6.1",
@@ -7686,12 +6977,6 @@
       "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
       "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="
     },
-    "node_modules/performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
-      "optional": true
-    },
     "node_modules/picocolors": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -7914,12 +7199,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/process-nextick-args": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
-      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
-      "optional": true
-    },
     "node_modules/progress": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
@@ -7928,15 +7207,6 @@
         "node": ">=0.4.0"
       }
     },
-    "node_modules/promisify-node": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/promisify-node/-/promisify-node-0.2.1.tgz",
-      "integrity": "sha512-eKqupYBxdDPbn9vyCng7KCw9a4VtUMIKG799k4ufS1F2Pn9PzzGVsuzRLO51FtbXN8wH2SWHq+gK27RRRr+xqw==",
-      "optional": true,
-      "dependencies": {
-        "nodegit-promise": "~3.0.2"
-      }
-    },
     "node_modules/prompts": {
       "version": "2.4.2",
       "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -8220,26 +7490,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/quote-stream": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
-      "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==",
-      "optional": true,
-      "dependencies": {
-        "buffer-equal": "0.0.1",
-        "minimist": "^1.1.3",
-        "through2": "^2.0.0"
-      },
-      "bin": {
-        "quote-stream": "bin/cmd.js"
-      }
-    },
-    "node_modules/ramda": {
-      "version": "0.18.0",
-      "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.18.0.tgz",
-      "integrity": "sha512-bSgBktaZE0uDH5KmMpbizsxSNcw9MumqtouUVUrxHZSunm+WdDc/UlzwWFtgqMfngX7TZ12d9QsyWkYK7OoJSw==",
-      "optional": true
-    },
     "node_modules/range-parser": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -8337,84 +7587,6 @@
         "url": "https://github.com/sponsors/Borewit"
       }
     },
-    "node_modules/request": {
-      "version": "2.88.2",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
-      "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
-      "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
-      "optional": true,
-      "dependencies": {
-        "aws-sign2": "~0.7.0",
-        "aws4": "^1.8.0",
-        "caseless": "~0.12.0",
-        "combined-stream": "~1.0.6",
-        "extend": "~3.0.2",
-        "forever-agent": "~0.6.1",
-        "form-data": "~2.3.2",
-        "har-validator": "~5.1.3",
-        "http-signature": "~1.2.0",
-        "is-typedarray": "~1.0.0",
-        "isstream": "~0.1.2",
-        "json-stringify-safe": "~5.0.1",
-        "mime-types": "~2.1.19",
-        "oauth-sign": "~0.9.0",
-        "performance-now": "^2.1.0",
-        "qs": "~6.5.2",
-        "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.5.0",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^3.3.2"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/request/node_modules/form-data": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
-      "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
-      "optional": true,
-      "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.6",
-        "mime-types": "^2.1.12"
-      },
-      "engines": {
-        "node": ">= 0.12"
-      }
-    },
-    "node_modules/request/node_modules/qs": {
-      "version": "6.5.3",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
-      "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
-      "optional": true,
-      "engines": {
-        "node": ">=0.6"
-      }
-    },
-    "node_modules/request/node_modules/tough-cookie": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
-      "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
-      "optional": true,
-      "dependencies": {
-        "psl": "^1.1.28",
-        "punycode": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/request/node_modules/uuid": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
-      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
-      "deprecated": "Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.",
-      "optional": true,
-      "bin": {
-        "uuid": "bin/uuid"
-      }
-    },
     "node_modules/require-directory": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -8433,7 +7605,7 @@
       "version": "1.22.1",
       "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
       "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
-      "devOptional": true,
+      "dev": true,
       "dependencies": {
         "is-core-module": "^2.9.0",
         "path-parse": "^1.0.7",
@@ -8766,12 +7938,6 @@
       "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
       "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
     },
-    "node_modules/shallow-copy": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
-      "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==",
-      "optional": true
-    },
     "node_modules/sharp": {
       "version": "0.31.3",
       "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz",
@@ -8989,37 +8155,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/sprintf-js": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
-      "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
-      "optional": true
-    },
-    "node_modules/sshpk": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
-      "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
-      "optional": true,
-      "dependencies": {
-        "asn1": "~0.2.3",
-        "assert-plus": "^1.0.0",
-        "bcrypt-pbkdf": "^1.0.0",
-        "dashdash": "^1.12.0",
-        "ecc-jsbn": "~0.1.1",
-        "getpass": "^0.1.1",
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.0.2",
-        "tweetnacl": "~0.14.0"
-      },
-      "bin": {
-        "sshpk-conv": "bin/sshpk-conv",
-        "sshpk-sign": "bin/sshpk-sign",
-        "sshpk-verify": "bin/sshpk-verify"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/stack-utils": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
@@ -9041,256 +8176,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/static-eval": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
-      "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
-      "optional": true,
-      "dependencies": {
-        "escodegen": "^1.11.1"
-      }
-    },
-    "node_modules/static-eval/node_modules/escodegen": {
-      "version": "1.14.3",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
-      "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
-      "optional": true,
-      "dependencies": {
-        "esprima": "^4.0.1",
-        "estraverse": "^4.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1"
-      },
-      "bin": {
-        "escodegen": "bin/escodegen.js",
-        "esgenerate": "bin/esgenerate.js"
-      },
-      "engines": {
-        "node": ">=4.0"
-      },
-      "optionalDependencies": {
-        "source-map": "~0.6.1"
-      }
-    },
-    "node_modules/static-eval/node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "optional": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/static-eval/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-      "optional": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/static-eval/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "optional": true,
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/static-eval/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
-      "optional": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/static-eval/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-      "optional": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/static-module": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz",
-      "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==",
-      "optional": true,
-      "dependencies": {
-        "concat-stream": "~1.6.0",
-        "convert-source-map": "^1.5.1",
-        "duplexer2": "~0.1.4",
-        "escodegen": "~1.9.0",
-        "falafel": "^2.1.0",
-        "has": "^1.0.1",
-        "magic-string": "^0.22.4",
-        "merge-source-map": "1.0.4",
-        "object-inspect": "~1.4.0",
-        "quote-stream": "~1.0.2",
-        "readable-stream": "~2.3.3",
-        "shallow-copy": "~0.0.1",
-        "static-eval": "^2.0.0",
-        "through2": "~2.0.3"
-      }
-    },
-    "node_modules/static-module/node_modules/convert-source-map": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
-      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
-      "optional": true
-    },
-    "node_modules/static-module/node_modules/escodegen": {
-      "version": "1.9.1",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
-      "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
-      "optional": true,
-      "dependencies": {
-        "esprima": "^3.1.3",
-        "estraverse": "^4.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1"
-      },
-      "bin": {
-        "escodegen": "bin/escodegen.js",
-        "esgenerate": "bin/esgenerate.js"
-      },
-      "engines": {
-        "node": ">=4.0"
-      },
-      "optionalDependencies": {
-        "source-map": "~0.6.1"
-      }
-    },
-    "node_modules/static-module/node_modules/esprima": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
-      "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==",
-      "optional": true,
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/static-module/node_modules/estraverse": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
-      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
-      "optional": true,
-      "engines": {
-        "node": ">=4.0"
-      }
-    },
-    "node_modules/static-module/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "optional": true
-    },
-    "node_modules/static-module/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-      "optional": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/static-module/node_modules/object-inspect": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz",
-      "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==",
-      "optional": true
-    },
-    "node_modules/static-module/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "optional": true,
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/static-module/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
-      "optional": true,
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/static-module/node_modules/readable-stream": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-      "optional": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/static-module/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "optional": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "node_modules/static-module/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-      "optional": true,
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
     "node_modules/statuses": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
@@ -9435,7 +8320,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "devOptional": true,
+      "dev": true,
       "engines": {
         "node": ">= 0.4"
       },
@@ -9572,46 +8457,6 @@
       "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
       "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="
     },
-    "node_modules/through2": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-      "optional": true,
-      "dependencies": {
-        "readable-stream": "~2.3.6",
-        "xtend": "~4.0.1"
-      }
-    },
-    "node_modules/through2/node_modules/isarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
-      "optional": true
-    },
-    "node_modules/through2/node_modules/readable-stream": {
-      "version": "2.3.8",
-      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
-      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
-      "optional": true,
-      "dependencies": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.3",
-        "isarray": "~1.0.0",
-        "process-nextick-args": "~2.0.0",
-        "safe-buffer": "~5.1.1",
-        "string_decoder": "~1.1.1",
-        "util-deprecate": "~1.0.1"
-      }
-    },
-    "node_modules/through2/node_modules/string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "optional": true,
-      "dependencies": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
     "node_modules/tiny-emitter": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
@@ -9712,12 +8557,6 @@
         "node": "*"
       }
     },
-    "node_modules/tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
-      "optional": true
-    },
     "node_modules/type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -9763,12 +8602,6 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
-      "optional": true
-    },
     "node_modules/unbzip2-stream": {
       "version": "1.4.3",
       "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
@@ -9778,19 +8611,6 @@
         "through": "^2.3.8"
       }
     },
-    "node_modules/underscore.string": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz",
-      "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==",
-      "optional": true,
-      "dependencies": {
-        "sprintf-js": "^1.1.1",
-        "util-deprecate": "^1.0.2"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
     "node_modules/universal-user-agent": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
@@ -9842,7 +8662,7 @@
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
       "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
-      "devOptional": true,
+      "dev": true,
       "dependencies": {
         "punycode": "^2.1.0"
       }
@@ -9913,32 +8733,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
-      "engines": [
-        "node >=0.6.0"
-      ],
-      "optional": true,
-      "dependencies": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      }
-    },
-    "node_modules/verror/node_modules/core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
-      "optional": true
-    },
-    "node_modules/vlq": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
-      "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
-      "optional": true
-    },
     "node_modules/vue": {
       "version": "2.7.14",
       "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz",
@@ -10165,15 +8959,6 @@
       "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
       "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
     },
-    "node_modules/xtend": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
-      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
-      "optional": true,
-      "engines": {
-        "node": ">=0.4"
-      }
-    },
     "node_modules/y18n": {
       "version": "5.0.8",
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",

From b4908d81a3c877c7ddbd0c469f0b9fb53441d2f2 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 15 Mar 2023 20:38:04 -0400
Subject: [PATCH 113/196] fix(plugins/lines): handle no history data

---
 .github/workflows/examples.yml    |  1 -
 source/plugins/lines/examples.yml |  1 -
 source/plugins/lines/index.mjs    | 92 ++++++++++++++++---------------
 tests/cases/lines.plugin.yml      |  1 -
 4 files changed, 49 insertions(+), 46 deletions(-)

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 4d597531874..63e504c2501 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -289,7 +289,6 @@ jobs:
             @use.patterns
             */*
             +lowlighter/metrics
-            +lowlighter/brain
           output_action: none
           delay: 120
           user: lowlighter
diff --git a/source/plugins/lines/examples.yml b/source/plugins/lines/examples.yml
index d08c816f424..b2afeb1f303 100644
--- a/source/plugins/lines/examples.yml
+++ b/source/plugins/lines/examples.yml
@@ -20,4 +20,3 @@
       @use.patterns
       */*
       +lowlighter/metrics
-      +lowlighter/brain
diff --git a/source/plugins/lines/index.mjs b/source/plugins/lines/index.mjs
index 8903681db5d..1888c6ccd5c 100644
--- a/source/plugins/lines/index.mjs
+++ b/source/plugins/lines/index.mjs
@@ -71,54 +71,60 @@ export default async function({login, data, imports, rest, q, account}, {enabled
 
     //Diff graphs
     if (sections.includes("history")) {
-      //Generate SVG
-      const height = 315, width = 480
-      const margin = 5, offset = 34
-      const {d3} = imports
       const weeks = result.weeks.filter(({date}) => !_history_limit ? true : new Date(date) > new Date(new Date().getFullYear() - _history_limit, 0, 0))
-      const d3n = new imports.D3node()
-      const svg = d3n.createSVG(width, height)
+      if (weeks.length) {
+        //Generate SVG
+        const height = 315, width = 480
+        const margin = 5, offset = 34
+        const {d3} = imports
+        const d3n = new imports.D3node()
+        const svg = d3n.createSVG(width, height)
 
-      //Time range
-      const start = new Date(weeks.at(0).date)
-      const end = new Date(weeks.at(-1).date)
-      const x = d3.scaleTime()
-        .domain([start, end])
-        .range([margin + offset, width - (offset + margin)])
-      svg.append("g")
-        .attr("transform", `translate(0,${height - (offset + margin)})`)
-        .call(d3.axisBottom(x))
-        .selectAll("text")
-        .attr("transform", "translate(-5,5) rotate(-45)")
-        .style("text-anchor", "end")
-        .style("font-size", 20)
+        //Time range
+        const start = new Date(weeks.at(0).date)
+        const end = new Date(weeks.at(-1).date)
+        const x = d3.scaleTime()
+          .domain([start, end])
+          .range([margin + offset, width - (offset + margin)])
+        svg.append("g")
+          .attr("transform", `translate(0,${height - (offset + margin)})`)
+          .call(d3.axisBottom(x))
+          .selectAll("text")
+          .attr("transform", "translate(-5,5) rotate(-45)")
+          .style("text-anchor", "end")
+          .style("font-size", 20)
 
-      //Diff range
-      const points = weeks.flatMap(({added, deleted, changed}) => [added + changed, deleted + changed])
-      const extremum = Math.max(...points)
-      const y = d3.scaleLinear()
-        .domain([extremum, -extremum])
-        .range([margin, height - (offset + margin)])
-      svg.append("g")
-        .attr("transform", `translate(${margin + offset},0)`)
-        .call(d3.axisLeft(y).ticks(7).tickFormat(d3.format(".2s")))
-        .selectAll("text")
-        .style("font-size", 20)
+        //Diff range
+        const points = weeks.flatMap(({added, deleted, changed}) => [added + changed, deleted + changed])
+        const extremum = Math.max(...points)
+        const y = d3.scaleLinear()
+          .domain([extremum, -extremum])
+          .range([margin, height - (offset + margin)])
+        svg.append("g")
+          .attr("transform", `translate(${margin + offset},0)`)
+          .call(d3.axisLeft(y).ticks(7).tickFormat(d3.format(".2s")))
+          .selectAll("text")
+          .style("font-size", 20)
 
-      //Generate history
-      for (const {type, sign, fill} of [{type: "added", sign: +1, fill: "rgb(63, 185, 80)"}, {type: "deleted", sign: -1, fill: "rgb(218, 54, 51)"}]) {
-        svg.append("path")
-          .datum(weeks.map(({date, ...diff}) => [new Date(date), sign * (diff[type] + diff.changed)]))
-          .attr(
-            "d",
-            d3.area()
-              .x(d => x(d[0]))
-              .y0(d => y(d[1]))
-              .y1(() => y(0)),
-          )
-          .attr("fill", fill)
+        //Generate history
+        for (const {type, sign, fill} of [{type: "added", sign: +1, fill: "rgb(63, 185, 80)"}, {type: "deleted", sign: -1, fill: "rgb(218, 54, 51)"}]) {
+          svg.append("path")
+            .datum(weeks.map(({date, ...diff}) => [new Date(date), sign * (diff[type] + diff.changed)]))
+            .attr(
+              "d",
+              d3.area()
+                .x(d => x(d[0]))
+                .y0(d => y(d[1]))
+                .y1(() => y(0)),
+            )
+            .attr("fill", fill)
+        }
+        result.history = d3n.svgString()
+      }
+      else {
+        console.debug(`metrics/compute/${login}/plugins > lines > no history data`)
+        result.history = null
       }
-      result.history = d3n.svgString()
     }
 
     //Results
diff --git a/tests/cases/lines.plugin.yml b/tests/cases/lines.plugin.yml
index f824b141ccb..3c684a5a8ac 100644
--- a/tests/cases/lines.plugin.yml
+++ b/tests/cases/lines.plugin.yml
@@ -18,6 +18,5 @@
       @use.patterns
       */*
       +lowlighter/metrics
-      +lowlighter/brain
     use_mocked_data: 'yes'
     verify: 'yes'

From ff1008392f6c4bfbe0dbee33049b6db7211dbfc3 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 16 Mar 2023 01:21:21 +0000
Subject: [PATCH 114/196] chore: code formatting

---
 source/app/metrics/utils.mjs             | 76 ++++++++++++------------
 source/plugins/community/stock/index.mjs |  2 +-
 source/plugins/habits/index.mjs          |  8 +--
 source/plugins/stargazers/index.mjs      | 14 ++---
 4 files changed, 50 insertions(+), 50 deletions(-)

diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 97dff699031..464e0d58ba8 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -822,7 +822,7 @@ export const Graph = {
   /**Basic Graph */
   graph(type, data, {area = true, points = true, text = true, low = NaN, high = NaN, match = null, labels = null, width = 480, height = 315, ticks = 0} = {}) {
     //Generate SVG
-    const margin = {top:10, left:10, right:10, bottom:45}
+    const margin = {top: 10, left: 10, right: 10, bottom: 45}
     const d3n = new D3node()
     const svg = d3n.createSVG(width, height)
 
@@ -862,7 +862,7 @@ export const Graph = {
       .range([margin.left, height - margin.top - margin.bottom])
     svg.append("g")
       .attr("transform", `translate(${margin.left},${margin.top})`)
-      .call(d3.axisRight(y).ticks(Math.round(height/50)).tickSize(width - margin.left - margin.right))
+      .call(d3.axisRight(y).ticks(Math.round(height / 50)).tickSize(width - margin.left - margin.right))
       .call(g => g.select(".domain").remove())
       .call(g => g.selectAll(".tick line").attr("stroke-opacity", 0.5).attr("stroke-dasharray", "2,2"))
       .call(g => g.selectAll(".tick text").attr("x", 0).attr("dy", -4))
@@ -883,7 +883,7 @@ export const Graph = {
         d3.line()
           .curve(d3.curveLinear)
           .x(d => x(d[0]))
-          .y(d => y(d[1]))
+          .y(d => y(d[1])),
       )
       .attr("fill", "transparent")
       .attr("stroke", "#87ceeb")
@@ -892,24 +892,24 @@ export const Graph = {
     //Generate graph area
     if (area) {
       svg.append("path")
-      .datum(datum)
-      .attr("transform", `translate(${margin.left},${margin.top})`)
-      .attr(
-        "d",
-        d3.area()
-          .curve(d3.curveLinear)
-          .x(d => x(d[0]))
-          .y0(d => y(d[1]))
-          .y1(() => y(low)),
-      )
-      .attr("fill", "rgba(88, 166, 255, .1)")
+        .datum(datum)
+        .attr("transform", `translate(${margin.left},${margin.top})`)
+        .attr(
+          "d",
+          d3.area()
+            .curve(d3.curveLinear)
+            .x(d => x(d[0]))
+            .y0(d => y(d[1]))
+            .y1(() => y(low)),
+        )
+        .attr("fill", "rgba(88, 166, 255, .1)")
     }
 
     //Generate graph points
     if (points) {
       svg.append("g")
-      .selectAll("circle")
-      .data(yticked)
+        .selectAll("circle")
+        .data(yticked)
         .join("circle")
         .attr("transform", `translate(${margin.left},${margin.top})`)
         .attr("cx", d => x(d[0]))
@@ -929,10 +929,10 @@ export const Graph = {
         .attr("stroke-linejoin", "round")
         .attr("stroke-width", 4)
         .attr("paint-order", "stroke fill")
-      .selectAll("text")
-      .data(yticked)
-      .join("text")
-        .attr("transform", `translate(${margin.left},${margin.top-4})`)
+        .selectAll("text")
+        .data(yticked)
+        .join("text")
+        .attr("transform", `translate(${margin.left},${margin.top - 4})`)
         .attr("x", d => x(d[0]))
         .attr("y", d => y(d[1]))
         .text(d => d[2] ? d[2] : "")
@@ -955,46 +955,46 @@ export const Graph = {
 
     //Construct arcs
     const color = d3.scaleOrdinal(K, d3.schemeSpectral[K.length])
-    const arcs = d3.pie().padAngle(1/radius).sort(null).value(i => V[i])(I)
+    const arcs = d3.pie().padAngle(1 / radius).sort(null).value(i => V[i])(I)
     const arc = d3.arc().innerRadius(0).outerRadius(radius)
-    const labels = d3.arc().innerRadius(radius/2).outerRadius(radius/2)
+    const labels = d3.arc().innerRadius(radius / 2).outerRadius(radius / 2)
 
     svg.append("g")
-      .attr("transform", `translate(${width/2},${height/2})`)
+      .attr("transform", `translate(${width / 2},${height / 2})`)
       .attr("stroke", "white")
       .attr("stroke-width", 1)
       .attr("stroke-linejoin", "round")
-    .selectAll("path")
-    .data(arcs)
-    .join("path")
+      .selectAll("path")
+      .data(arcs)
+      .join("path")
       .attr("fill", d => colors?.[K[d.data]] ?? color(K[d.data]))
       .attr("d", arc)
-    .append("title")
+      .append("title")
       .text(d => `${K[d.data]}\n${V[d.data]}`)
 
     svg.append("g")
-      .attr("transform", `translate(${width/2},${height/2})`)
+      .attr("transform", `translate(${width / 2},${height / 2})`)
       .attr("font-family", "sans-serif")
       .attr("font-size", 12)
       .attr("text-anchor", "middle")
       .attr("fill", "white")
       .attr("stroke", "rbga(0,0,0,.9)")
       .attr("paint-order", "stroke fill")
-    .selectAll("text")
-    .data(arcs)
-    .join("text")
+      .selectAll("text")
+      .data(arcs)
+      .join("text")
       .attr("transform", d => `translate(${labels.centroid(d)})`)
-    .selectAll("tspan")
-    .data(d => {
-      const lines = `${K[d.data]}\n${V[d.data]}`.split(/\n/)
-      return (d.endAngle - d.startAngle) > 0.25 ? lines : lines.slice(0, 1)
-    })
-    .join("tspan")
+      .selectAll("tspan")
+      .data(d => {
+        const lines = `${K[d.data]}\n${V[d.data]}`.split(/\n/)
+        return (d.endAngle - d.startAngle) > 0.25 ? lines : lines.slice(0, 1)
+      })
+      .join("tspan")
       .attr("x", 0)
       .attr("y", (_, i) => `${i * 1.1}em`)
       .attr("font-weight", (_, i) => i ? null : "bold")
       .text(d => d)
 
     return d3n.svgString()
-  }
+  },
 }
diff --git a/source/plugins/community/stock/index.mjs b/source/plugins/community/stock/index.mjs
index 5bf1e2cc890..06c13508f4d 100644
--- a/source/plugins/community/stock/index.mjs
+++ b/source/plugins/community/stock/index.mjs
@@ -31,7 +31,7 @@ export default async function({login, q, imports, data, account}, {enabled = fal
 
     //Generating chart
     console.debug(`metrics/compute/${login}/plugins > stock > generating chart`)
-    const chart = imports.Graph.timeline(close.map((y, i) => ({x:new Date(timestamp[i]*1000), y})), {low:Math.min(...close), high:Math.max(...close), points:false, text:false, width: 480 * (1 + data.large), height:200})
+    const chart = imports.Graph.timeline(close.map((y, i) => ({x: new Date(timestamp[i] * 1000), y})), {low: Math.min(...close), high: Math.max(...close), points: false, text: false, width: 480 * (1 + data.large), height: 200})
 
     //Results
     return {chart, currency, price, previous, delta: price - previous, symbol, company, interval, duration}
diff --git a/source/plugins/habits/index.mjs b/source/plugins/habits/index.mjs
index 2626580bd59..2c2fea62635 100644
--- a/source/plugins/habits/index.mjs
+++ b/source/plugins/habits/index.mjs
@@ -120,14 +120,14 @@ export default async function({login, data, rest, imports, q, account}, {enabled
     if ((["graph", "chartist"].includes(_charts)) && (imports.metadata.plugins.habits.extras("charts.type", {extras}))) {
       console.debug(`metrics/compute/${login}/plugins > habits > generating charts`)
       habits.charts = await Promise.all([
-        {type: "line", data: {...empty(24), ...Object.fromEntries(Object.entries(habits.commits.hours).filter(([k]) => !Number.isNaN(+k)))}, ticks:24, low: 0, high: habits.commits.hours.max},
-        {type: "line", data: {...empty(7), ...Object.fromEntries(Object.entries(habits.commits.days).filter(([k]) => !Number.isNaN(+k)))}, ticks:7, low: 0, high: habits.commits.days.max, labels:["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], half: true},
-        {type: "pie", data: Object.fromEntries(Object.entries(habits.linguist.languages).map(([k, v]) => [k, (100*v).toFixed(2)])), colors:habits.linguist.colors, half: true},
+        {type: "line", data: {...empty(24), ...Object.fromEntries(Object.entries(habits.commits.hours).filter(([k]) => !Number.isNaN(+k)))}, ticks: 24, low: 0, high: habits.commits.hours.max},
+        {type: "line", data: {...empty(7), ...Object.fromEntries(Object.entries(habits.commits.days).filter(([k]) => !Number.isNaN(+k)))}, ticks: 7, low: 0, high: habits.commits.days.max, labels: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], half: true},
+        {type: "pie", data: Object.fromEntries(Object.entries(habits.linguist.languages).map(([k, v]) => [k, (100 * v).toFixed(2)])), colors: habits.linguist.colors, half: true},
       ].map(({type, data, high, low, ticks, colors = null, labels = null, half = false}) => {
         const width = 480 * (half ? 0.45 : 1)
         const height = 160
         if (type === "line")
-          return imports.Graph.line(Object.entries(data).map(([x, y]) => ({x:+x, y})), {low, high, ticks, labels, width, height})
+          return imports.Graph.line(Object.entries(data).map(([x, y]) => ({x: +x, y})), {low, high, ticks, labels, width, height})
         console.log(data)
         if (type === "pie")
           return imports.Graph.pie(data, {colors, width, height})
diff --git a/source/plugins/stargazers/index.mjs b/source/plugins/stargazers/index.mjs
index 21a356897dc..0910fd0ad51 100644
--- a/source/plugins/stargazers/index.mjs
+++ b/source/plugins/stargazers/index.mjs
@@ -9,7 +9,7 @@ export default async function({login, graphql, data, imports, q, queries, accoun
     //Load inputs
     let {days, charts: _charts, "charts.type": _charts_type, worldmap: _worldmap, "worldmap.sample": _worldmap_sample} = imports.metadata.plugins.stargazers.inputs({data, account, q})
     if (!days) {
-      days = Math.abs(parseInt((new Date() - new Date(data.user.createdAt))/1000/60/60/24))
+      days = Math.abs(parseInt((new Date() - new Date(data.user.createdAt)) / 1000 / 60 / 60 / 24))
       console.debug(`metrics/compute/${login}/plugins > stargazers > set days to ${days}`)
     }
 
@@ -65,13 +65,13 @@ export default async function({login, graphql, data, imports, q, queries, accoun
 
     //Generating charts
     let charts = _charts ? true : null
-    if ((["graph", "chartist"].includes(_charts_type)) && (imports.metadata.plugins.stargazers.extras("charts.type", {extras})))  {
+    if ((["graph", "chartist"].includes(_charts_type)) && (imports.metadata.plugins.stargazers.extras("charts.type", {extras}))) {
       console.debug(`metrics/compute/${login}/plugins > stargazers > generating charts`)
-      charts = await Promise.all([{data: total, low: total.min, high: total.max}, {data: increments, low: 0, high: increments.max, sign: true}].map(({data: {dates: set}, low, high, sign = false}) =>
-        imports.Graph.timeline(Object.entries(set).map(([x, y]) => ({x:new Date(x), y, text:imports.format(y, {sign})})), {low, high,
-          match:(data, ticks) => data.filter(([x]) => ticks.map(t => t.toISOString().slice(0, 10)).includes(x.toISOString().slice(0, 10))),
-        })
-      ))
+      charts = await Promise.all(
+        [{data: total, low: total.min, high: total.max}, {data: increments, low: 0, high: increments.max, sign: true}].map(({data: {dates: set}, low, high, sign = false}) =>
+          imports.Graph.timeline(Object.entries(set).map(([x, y]) => ({x: new Date(x), y, text: imports.format(y, {sign})})), {low, high, match: (data, ticks) => data.filter(([x]) => ticks.map(t => t.toISOString().slice(0, 10)).includes(x.toISOString().slice(0, 10)))})
+        ),
+      )
     }
 
     //Generating worldmap

From 2ca1f471e1a7a920183a649910efd4bd18efeb86 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 16 Mar 2023 01:22:15 +0000
Subject: [PATCH 115/196] ci: auto-regenerate files

---
 README.md                                |  4 +--
 action.yml                               |  4 +++
 source/plugins/community/stock/README.md |  2 +-
 source/plugins/habits/README.md          |  9 ++++---
 source/plugins/lines/README.md           |  4 +++
 source/plugins/stargazers/README.md      | 32 ++++++++++++++++++------
 6 files changed, 42 insertions(+), 13 deletions(-)

diff --git a/README.md b/README.md
index eb85ce83a80..a19406f546e 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
   </tr>
   <tr>
     <th colspan="2" align="center">
-      <h3><a href="/README.md#-plugins">🧩 Customizable with 46 plugins and 328 options!</a></h3>
+      <h3><a href="/README.md#-plugins">🧩 Customizable with 46 plugins and 329 options!</a></h3>
     </th>
   </tr>
   <tr>
@@ -47,7 +47,7 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
   <tr>
         <td  align="center">
         <details open><summary>Classic charts</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.svg" alt=""></img></details>
-        <details><summary>Chartist charts</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.chartist.svg" alt=""></img></details>
+        <details><summary>Graph charts</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.graph.svg" alt=""></img></details>
         <details open><summary>Worldmap</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.worldmap.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
diff --git a/action.yml b/action.yml
index 75893b521f8..d35035dc757 100644
--- a/action.yml
+++ b/action.yml
@@ -348,6 +348,10 @@ inputs:
     description: Enable stargazers plugin
     default: <default-value>
 
+  plugin_stargazers_days:
+    description: Time range
+    default: <default-value>
+
   plugin_stargazers_charts:
     description: Charts
     default: <default-value>
diff --git a/source/plugins/community/stock/README.md b/source/plugins/community/stock/README.md
index 692d2dc609e..1a4f5953c04 100644
--- a/source/plugins/community/stock/README.md
+++ b/source/plugins/community/stock/README.md
@@ -39,7 +39,7 @@
   <tr>
     <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
-<li><i>metrics.npm.optional.chartist</i></li>
+<li><i>metrics.npm.optional.d3</i></li>
 <li><i>metrics.api.yahoo.finance</i></li>
 </ul>
 <b>type:</b> <code>boolean</code>
diff --git a/source/plugins/habits/README.md b/source/plugins/habits/README.md
index 50f0deb67e1..93ee388e79e 100644
--- a/source/plugins/habits/README.md
+++ b/source/plugins/habits/README.md
@@ -116,19 +116,22 @@ Recent language activity may also displayed (it requires extras features to be e
     <td rowspan="2"><p>Charts display type</p>
 <ul>
 <li><code>classic</code>: <code>&lt;div&gt;</code> based charts, simple and lightweight</li>
-<li><code>chartist</code>: <code>&lt;svg&gt;</code> based charts, smooth</li>
+<li><code>graph</code>: <code>&lt;svg&gt;</code> based charts, smooth</li>
 </ul>
+<blockquote>
+<p>⚠️ <code>chartist</code> option has been deprecated and is now equivalent to <code>graph</code></p>
+</blockquote>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
     <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
-<li><i>metrics.npm.optional.chartist</i></li>
+<li><i>metrics.npm.optional.d3</i></li>
 </ul>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> classic<br>
-<b>allowed values:</b><ul><li>classic</li><li>chartist</li></ul></td>
+<b>allowed values:</b><ul><li>classic</li><li>graph</li><li>chartist</li></ul></td>
   </tr>
   <tr>
     <td nowrap="nowrap"><h4><code>plugin_habits_trim</code></h4></td>
diff --git a/source/plugins/lines/README.md b/source/plugins/lines/README.md
index 4d9145287fc..1271e38e4e7 100644
--- a/source/plugins/lines/README.md
+++ b/source/plugins/lines/README.md
@@ -126,6 +126,10 @@ with:
   plugin_lines_sections: repositories, history
   plugin_lines_repositories_limit: 2
   plugin_lines_history_limit: 1
+  repositories_skipped: |
+    @use.patterns
+    */*
+    +lowlighter/metrics
 
 ```
 <!--/examples-->
diff --git a/source/plugins/stargazers/README.md b/source/plugins/stargazers/README.md
index 86749a9588f..f960e872d45 100644
--- a/source/plugins/stargazers/README.md
+++ b/source/plugins/stargazers/README.md
@@ -20,7 +20,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   <tr>
     <td colspan="2" align="center">
       <details open><summary>Classic charts</summary><img src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.svg" alt=""></img></details>
-      <details><summary>Chartist charts</summary><img src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.chartist.svg" alt=""></img></details>
+      <details><summary>Graph charts</summary><img src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.graph.svg" alt=""></img></details>
       <details open><summary>Worldmap</summary><img src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stargazers.worldmap.svg" alt=""></img></details>
       <img width="900" height="1" alt="">
     </td>
@@ -55,6 +55,21 @@ Follow instructions from their [documentation](https://developers.google.com/map
     <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_stargazers_days</code></h4></td>
+    <td rowspan="2"><p>Time range</p>
+<p>If set to <code>0</code> the account registration date will be used.</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
+<i>(0 ≤
+𝑥)</i>
+<br>
+<b>zero behaviour:</b> see description</br>
+<b>default:</b> 14<br></td>
   </tr>
   <tr>
     <td nowrap="nowrap"><h4><code>plugin_stargazers_charts</code></h4></td>
@@ -72,19 +87,22 @@ Follow instructions from their [documentation](https://developers.google.com/map
     <td rowspan="2"><p>Charts display type</p>
 <ul>
 <li><code>classic</code>: <code>&lt;div&gt;</code> based charts, simple and lightweight</li>
-<li><code>chartist</code>: <code>&lt;svg&gt;</code> based charts, smooth</li>
+<li><code>graph</code>: <code>&lt;svg&gt;</code> based charts, smooth</li>
 </ul>
+<blockquote>
+<p>⚠️ <code>chartist</code> option has been deprecated and is now equivalent to <code>graph</code></p>
+</blockquote>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
     <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
-<li><i>metrics.npm.optional.chartist</i></li>
+<li><i>metrics.npm.optional.d3</i></li>
 </ul>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> classic<br>
-<b>allowed values:</b><ul><li>classic</li><li>chartist</li></ul></td>
+<b>allowed values:</b><ul><li>classic</li><li>graph</li><li>chartist</li></ul></td>
   </tr>
   <tr>
     <td nowrap="nowrap"><h4><code>plugin_stargazers_worldmap</code></h4></td>
@@ -143,14 +161,14 @@ with:
 
 ```
 ```yaml
-name: Using chartist charts
+name: Using graph charts
 uses: lowlighter/metrics@latest
 with:
-  filename: metrics.plugin.stargazers.chartist.svg
+  filename: metrics.plugin.stargazers.graph.svg
   token: ${{ secrets.METRICS_TOKEN }}
   base: ""
   plugin_stargazers: yes
-  plugin_stargazers_charts_type: chartist
+  plugin_stargazers_charts_type: graph
 
 ```
 ```yaml

From 7520a8d44c434f798a997bf4817e65f45c5624a9 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 27 Mar 2023 17:47:57 -0400
Subject: [PATCH 116/196] chore(deps): bump open-graph-scraper from 5.1.1 to
 5.2.3 (#1412) [skip ci]

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index b8c5b40f9eb..afe975bb667 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -35,7 +35,7 @@
         "memory-cache": "^0.2.0",
         "minimatch": "^7.4.2",
         "node-fetch": "^3.3.1",
-        "open-graph-scraper": "^5.1.1",
+        "open-graph-scraper": "^5.2.3",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
         "puppeteer": "^19.7.4",
@@ -6749,9 +6749,9 @@
       }
     },
     "node_modules/open-graph-scraper": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-5.1.1.tgz",
-      "integrity": "sha512-6InA4pCjiWk7bAQWzVtjJrJRXAdaLdYBaNxuUU8UAgYbz5MWN4YLkgZkRtqgSf0F6VPOWDe3BGQNKwSCgYu05w==",
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-5.2.3.tgz",
+      "integrity": "sha512-OFKyI3Zv60onbwjUtwTdLwMB9P1O0+U2JV0HD4hHdwyKGwDhyM09udZVU5vEwe/PxI4MyPuVaxcdy1okc4SgWw==",
       "dependencies": {
         "chardet": "^1.5.1",
         "cheerio": "^1.0.0-rc.12",
diff --git a/package.json b/package.json
index ee6c4561809..d7337d0c84e 100644
--- a/package.json
+++ b/package.json
@@ -54,7 +54,7 @@
     "memory-cache": "^0.2.0",
     "minimatch": "^7.4.2",
     "node-fetch": "^3.3.1",
-    "open-graph-scraper": "^5.1.1",
+    "open-graph-scraper": "^5.2.3",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
     "puppeteer": "^19.7.4",

From 3f3aac59ad42e966cdce8ca0af569bd6a03a0e0f Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 27 Mar 2023 17:48:12 -0400
Subject: [PATCH 117/196] chore(deps): bump sharp from 0.31.3 to 0.32.0 (#1411)
 [skip ci]

---
 package-lock.json | 16 ++++++++--------
 package.json      |  2 +-
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index afe975bb667..cc175786f81 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -42,7 +42,7 @@
         "purgecss": "^5.0.0",
         "rss-parser": "^3.12.0",
         "sanitize-html": "^2.10.0",
-        "sharp": "^0.31.3",
+        "sharp": "^0.32.0",
         "simple-git": "^3.17.0",
         "svgo": "^3.0.2",
         "vue": "^2.7.1",
@@ -6553,9 +6553,9 @@
       }
     },
     "node_modules/node-addon-api": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz",
-      "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA=="
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.0.0.tgz",
+      "integrity": "sha512-GyHvgPvUXBvAkXa0YvYnhilSB1A+FRYMpIVggKzPZqdaZfevZOuzfWzyvgzOwRLHBeo/MMswmJFsrNF4Nw1pmA=="
     },
     "node_modules/node-cache": {
       "version": "5.1.2",
@@ -7939,14 +7939,14 @@
       "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
     },
     "node_modules/sharp": {
-      "version": "0.31.3",
-      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.31.3.tgz",
-      "integrity": "sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg==",
+      "version": "0.32.0",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.0.tgz",
+      "integrity": "sha512-yLAypVcqj1toSAqRSwbs86nEzfyZVDYqjuUX8grhFpeij0DDNagKJXELS/auegDBRDg1XBtELdOGfo2X1cCpeA==",
       "hasInstallScript": true,
       "dependencies": {
         "color": "^4.2.3",
         "detect-libc": "^2.0.1",
-        "node-addon-api": "^5.0.0",
+        "node-addon-api": "^6.0.0",
         "prebuild-install": "^7.1.1",
         "semver": "^7.3.8",
         "simple-get": "^4.0.1",
diff --git a/package.json b/package.json
index d7337d0c84e..fe532a582ba 100644
--- a/package.json
+++ b/package.json
@@ -61,7 +61,7 @@
     "purgecss": "^5.0.0",
     "rss-parser": "^3.12.0",
     "sanitize-html": "^2.10.0",
-    "sharp": "^0.31.3",
+    "sharp": "^0.32.0",
     "simple-git": "^3.17.0",
     "svgo": "^3.0.2",
     "vue": "^2.7.1",

From faa273df4651e63637cba698238a95e358d87c26 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 27 Mar 2023 17:48:17 -0400
Subject: [PATCH 118/196] chore(deps): bump puppeteer from 19.7.4 to 19.8.0
 (#1410) [skip ci]

---
 package-lock.json | 121 +++++++++-------------------------------------
 package.json      |   2 +-
 2 files changed, 23 insertions(+), 100 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index cc175786f81..8ba818bb1ed 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -38,7 +38,7 @@
         "open-graph-scraper": "^5.2.3",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^19.7.4",
+        "puppeteer": "^19.8.0",
         "purgecss": "^5.0.0",
         "rss-parser": "^3.12.0",
         "sanitize-html": "^2.10.0",
@@ -2833,9 +2833,9 @@
       }
     },
     "node_modules/chromium-bidi": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.4.tgz",
-      "integrity": "sha512-4BX5cSaponuvVT1+SbLYTOAgDoVtX/Khoc9UsbFJ/AsPVUeFAM3RiIDFI6XFhLYMi9WmVJqh1ZH+dRpNKkKwiQ==",
+      "version": "0.4.5",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.5.tgz",
+      "integrity": "sha512-rkav9YzRfAshSTG3wNXF7P7yNiI29QAo1xBXElPoCoSQR5n20q3cOyVhDv6S7+GlF/CJ/emUxlQiR0xOPurkGg==",
       "dependencies": {
         "mitt": "3.0.0"
       },
@@ -3092,9 +3092,9 @@
       "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
     },
     "node_modules/cosmiconfig": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.0.tgz",
-      "integrity": "sha512-0tLZ9URlPGU7JsKq0DQOQ3FoRsYX8xDZ7xMiATQfaiGMz7EHowNkbU9u1coAOmnh9p/1ySpm0RB3JNWRXM5GCg==",
+      "version": "8.1.3",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz",
+      "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==",
       "dependencies": {
         "import-fresh": "^3.2.1",
         "js-yaml": "^4.1.0",
@@ -3800,9 +3800,9 @@
       }
     },
     "node_modules/devtools-protocol": {
-      "version": "0.0.1094867",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1094867.tgz",
-      "integrity": "sha512-pmMDBKiRVjh0uKK6CT1WqZmM3hBVSgD+N2MrgyV1uNizAZMw4tx6i/RTc+/uCsKSCmg0xXx7arCP/OFcIwTsiQ=="
+      "version": "0.0.1107588",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz",
+      "integrity": "sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg=="
     },
     "node_modules/diff-sequences": {
       "version": "29.4.3",
@@ -6443,6 +6443,7 @@
       "version": "4.2.5",
       "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz",
       "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==",
+      "optional": true,
       "engines": {
         "node": ">=8"
       }
@@ -6924,29 +6925,6 @@
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
       "dev": true
     },
-    "node_modules/path-scurry": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.6.1.tgz",
-      "integrity": "sha512-OW+5s+7cw6253Q4E+8qQ/u1fVvcJQCJo/VFD8pje+dbJCF1n5ZRMV2AEHbGp+5Q7jxQIYJxkHopnj6nzdGeZLA==",
-      "dependencies": {
-        "lru-cache": "^7.14.1",
-        "minipass": "^4.0.2"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/path-scurry/node_modules/lru-cache": {
-      "version": "7.18.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
-      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
-      "engines": {
-        "node": ">=12"
-      }
-    },
     "node_modules/path-to-regexp": {
       "version": "0.1.7",
       "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
@@ -7260,34 +7238,33 @@
       }
     },
     "node_modules/puppeteer": {
-      "version": "19.7.4",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.7.4.tgz",
-      "integrity": "sha512-TdiNEG27BahPab4B/xfUth/L8yWV8ZT4D+/n01DWjK6pPQ2HgCGJGbL3dlSxUvor6dtxFBe16CEQ9JWXh0SCaQ==",
+      "version": "19.8.0",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.8.0.tgz",
+      "integrity": "sha512-MpQClmttCUxv4bVokX/YSXLCU12CUApuRf0rIJyGknYcIrDQNkLUx1N7hNt88Ya4lq9VDsdiDEJ3bcPijqJYPQ==",
       "hasInstallScript": true,
       "dependencies": {
-        "cosmiconfig": "8.1.0",
+        "cosmiconfig": "8.1.3",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.7.4"
+        "puppeteer-core": "19.8.0"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "19.7.4",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.7.4.tgz",
-      "integrity": "sha512-E8nVhqGF0ZM7s9pb5849gzKFG7282WYZaeGXo/eYDkpUpcPUgmkj7QrAoa8SpFXXyqHHilHJZPbfVBb4foDazQ==",
+      "version": "19.8.0",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.8.0.tgz",
+      "integrity": "sha512-5gBkLR9nae7chWDhI3mpj5QA+hPmjEOW29qw5ap5g51Uo5Lxe5Yip1uyQwZSjg5Wn/eyE9grh2Lyx3m8rPK90A==",
       "dependencies": {
-        "chromium-bidi": "0.4.4",
+        "chromium-bidi": "0.4.5",
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
-        "devtools-protocol": "0.0.1094867",
+        "devtools-protocol": "0.0.1107588",
         "extract-zip": "2.0.1",
         "https-proxy-agent": "5.0.1",
         "proxy-from-env": "1.1.0",
-        "rimraf": "4.4.0",
         "tar-fs": "2.1.1",
         "unbzip2-stream": "1.4.3",
-        "ws": "8.12.1"
+        "ws": "8.13.0"
       },
       "engines": {
         "node": ">=14.14.0"
@@ -7301,60 +7278,6 @@
         }
       }
     },
-    "node_modules/puppeteer-core/node_modules/glob": {
-      "version": "9.2.1",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-9.2.1.tgz",
-      "integrity": "sha512-Pxxgq3W0HyA3XUvSXcFhRSs+43Jsx0ddxcFrbjxNGkL2Ak5BAUBxLqI5G6ADDeCHLfzzXFhe0b1yYcctGmytMA==",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "minimatch": "^7.4.1",
-        "minipass": "^4.2.4",
-        "path-scurry": "^1.6.1"
-      },
-      "engines": {
-        "node": ">=16 || 14 >=14.17"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/rimraf": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.0.tgz",
-      "integrity": "sha512-X36S+qpCUR0HjXlkDe4NAOhS//aHH0Z+h8Ckf2auGJk3PTnx5rLmrHkwNdbVQuCSUhOyFrlRvFEllZOYE+yZGQ==",
-      "dependencies": {
-        "glob": "^9.2.0"
-      },
-      "bin": {
-        "rimraf": "dist/cjs/src/bin.js"
-      },
-      "engines": {
-        "node": ">=14"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/puppeteer-core/node_modules/ws": {
-      "version": "8.12.1",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz",
-      "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==",
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "peerDependencies": {
-        "bufferutil": "^4.0.1",
-        "utf-8-validate": ">=5.0.2"
-      },
-      "peerDependenciesMeta": {
-        "bufferutil": {
-          "optional": true
-        },
-        "utf-8-validate": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/pure-rand": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz",
diff --git a/package.json b/package.json
index fe532a582ba..98ee108c5a4 100644
--- a/package.json
+++ b/package.json
@@ -57,7 +57,7 @@
     "open-graph-scraper": "^5.2.3",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^19.7.4",
+    "puppeteer": "^19.8.0",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.12.0",
     "sanitize-html": "^2.10.0",

From 39ea762894a797ea251d36368e3686bfc5bb8ff5 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 27 Mar 2023 17:48:23 -0400
Subject: [PATCH 119/196] chore(deps): bump marked from 4.2.12 to 4.3.0 (#1409)
 [skip ci]

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 8ba818bb1ed..207069cb7fc 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -31,7 +31,7 @@
         "js-yaml": "^4.1.0",
         "jsdom": "^21.1.1",
         "linguist-js": "^2.5.4",
-        "marked": "^4.2.12",
+        "marked": "^4.3.0",
         "memory-cache": "^0.2.0",
         "minimatch": "^7.4.2",
         "node-fetch": "^3.3.1",
@@ -6307,9 +6307,9 @@
       }
     },
     "node_modules/marked": {
-      "version": "4.2.12",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
-      "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
+      "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
       "bin": {
         "marked": "bin/marked.js"
       },
diff --git a/package.json b/package.json
index 98ee108c5a4..7d40c648917 100644
--- a/package.json
+++ b/package.json
@@ -50,7 +50,7 @@
     "js-yaml": "^4.1.0",
     "jsdom": "^21.1.1",
     "linguist-js": "^2.5.4",
-    "marked": "^4.2.12",
+    "marked": "^4.3.0",
     "memory-cache": "^0.2.0",
     "minimatch": "^7.4.2",
     "node-fetch": "^3.3.1",

From d8f61ee3f432d000db4564f930f0fcfa01dda2f3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 27 Mar 2023 17:48:32 -0400
Subject: [PATCH 120/196] chore(deps): bump @primer/octicons from 18.2.0 to
 18.3.0 (#1408)

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 207069cb7fc..201991bd1cf 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,7 @@
         "@octokit/graphql": "^5.0.5",
         "@octokit/rest": "^19.0.7",
         "@primer/css": "^20.8.3",
-        "@primer/octicons": "^18.2.0",
+        "@primer/octicons": "^18.3.0",
         "@twemoji/parser": "^14.1.0",
         "axios": "^1.3.4",
         "clipboard": "^2.0.11",
@@ -1913,9 +1913,9 @@
       }
     },
     "node_modules/@primer/octicons": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-18.2.0.tgz",
-      "integrity": "sha512-Bx7PkGZUgbo/xbZSdufxKefg5JzvGPkIu/x93TAiWit+FoPBmLammqfHQe1Y5gmT2AWAuxJUksYN05hi7w6VnA==",
+      "version": "18.3.0",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-18.3.0.tgz",
+      "integrity": "sha512-vyUej5rKjXfqHAmYSo2k3pA9IsL5KJaYOBVXvc188FwBfUweA+WVP3qwWyZTSQnp9LK6yOajGyr0SCMIa9ombw==",
       "dependencies": {
         "object-assign": "^4.1.1"
       }
diff --git a/package.json b/package.json
index 7d40c648917..af9bfdae9fc 100644
--- a/package.json
+++ b/package.json
@@ -35,7 +35,7 @@
     "@octokit/graphql": "^5.0.5",
     "@octokit/rest": "^19.0.7",
     "@primer/css": "^20.8.3",
-    "@primer/octicons": "^18.2.0",
+    "@primer/octicons": "^18.3.0",
     "@twemoji/parser": "^14.1.0",
     "axios": "^1.3.4",
     "clipboard": "^2.0.11",

From 9f05a36b7908f95ace16605ac99cad007bdf46a2 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 27 Mar 2023 22:48:09 -0400
Subject: [PATCH 121/196] chore: prepare release v3.33 (#1403) [skip ci]

---
 package-lock.json | 4 ++--
 package.json      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 201991bd1cf..f7fb5985929 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "metrics",
-  "version": "3.33.0-beta",
+  "version": "3.33.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "metrics",
-      "version": "3.33.0-beta",
+      "version": "3.33.0",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index af9bfdae9fc..43008b33cc3 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "metrics",
-  "version": "3.33.0-beta",
+  "version": "3.33.0",
   "description": "An infographics generator with 40+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!",
   "main": "index.mjs",
   "scripts": {

From f01b8a0acb94040141e2f801da523dc4b4f2348e Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 27 Mar 2023 22:48:54 -0400
Subject: [PATCH 122/196] ci: auto-regenerate files

---
 README.md | 2 --
 1 file changed, 2 deletions(-)

diff --git a/README.md b/README.md
index a19406f546e..96e6094500c 100644
--- a/README.md
+++ b/README.md
@@ -448,8 +448,6 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
 # 📚 Documentation
 
 
-> <sup>*⚠️ This is the documentation of **v3.33-beta** (`@master`/`@main` branches) which includes [unreleased features](https://github.com/lowlighter/metrics/compare/latest...master) planned for next release. See documentation for current released version [**v3.32** (`@latest` branch) here](https://github.com/lowlighter/metrics/blob/latest/README.md).* </sup>
-
 
 
 ## 🦮 Setup

From dd64c50bf38be91795e73980f3483d028e7e55ee Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 27 Mar 2023 22:57:48 -0400
Subject: [PATCH 123/196] Release v3.33 [release]


From 4d0b2aa702c393f6a5d0fd278689038c4e7a5b34 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 29 Mar 2023 19:27:29 -0400
Subject: [PATCH 124/196] chore: create version 3.34-beta

---
 package-lock.json                          | 4 ++--
 package.json                               | 2 +-
 source/app/web/statics/embed/index.html    | 8 ++++----
 source/app/web/statics/index.html          | 6 +++---
 source/app/web/statics/insights/index.html | 8 ++++----
 source/app/web/statics/oauth/index.html    | 8 ++++----
 6 files changed, 18 insertions(+), 18 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index f7fb5985929..6c28a0040eb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "metrics",
-  "version": "3.33.0",
+  "version": "3.34.0-beta",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "metrics",
-      "version": "3.33.0",
+      "version": "3.34.0-beta",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index 43008b33cc3..6cb177b86c8 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "metrics",
-  "version": "3.33.0",
+  "version": "3.34.0-beta",
   "description": "An infographics generator with 40+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!",
   "main": "index.mjs",
   "scripts": {
diff --git a/source/app/web/statics/embed/index.html b/source/app/web/statics/embed/index.html
index 33b6153f083..2048611dcb0 100644
--- a/source/app/web/statics/embed/index.html
+++ b/source/app/web/statics/embed/index.html
@@ -8,8 +8,8 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.33">
-    <link rel="stylesheet" href="/.css/style.css?v=3.33">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.34">
+    <link rel="stylesheet" href="/.css/style.css?v=3.34">
     <link rel="stylesheet" href="/.css/style.prism.css" />
   </head>
   <body>
@@ -230,7 +230,7 @@
     <script src="/.js/vue.min.js"></script>
     <script src="/.js/vue.prism.min.js"></script>
     <script src="/.js/clipboard.min.js"></script>
-    <script src="/.js/embed/app.placeholder.js?v=3.33"></script>
-    <script src="/.js/embed/app.js?v=3.33"></script>
+    <script src="/.js/embed/app.placeholder.js?v=3.34"></script>
+    <script src="/.js/embed/app.js?v=3.34"></script>
   </body>
 </html>
\ No newline at end of file
diff --git a/source/app/web/statics/index.html b/source/app/web/statics/index.html
index 5832178c862..7d8f14d8df9 100644
--- a/source/app/web/statics/index.html
+++ b/source/app/web/statics/index.html
@@ -8,8 +8,8 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.33">
-    <link rel="stylesheet" href="/.css/style.css?v=3.33">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.34">
+    <link rel="stylesheet" href="/.css/style.css?v=3.34">
   </head>
   <body>
     <!-- Vue app -->
@@ -100,6 +100,6 @@ <h2>
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/.js/app.js?v=3.33"></script>
+    <script src="/.js/app.js?v=3.34"></script>
   </body>
 </html>
\ No newline at end of file
diff --git a/source/app/web/statics/insights/index.html b/source/app/web/statics/insights/index.html
index 497c0af58cf..e1c36ef27af 100644
--- a/source/app/web/statics/insights/index.html
+++ b/source/app/web/statics/insights/index.html
@@ -8,9 +8,9 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.33">
-    <link rel="stylesheet" href="/.css/style.css?v=3.33">
-    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.33">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.34">
+    <link rel="stylesheet" href="/.css/style.css?v=3.34">
+    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.34">
   </head>
   <body>
     <!-- Vue app -->
@@ -601,6 +601,6 @@ <h2>
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/insights/.statics/script.js?v=3.33"></script>
+    <script src="/insights/.statics/script.js?v=3.34"></script>
   </body>
 </html>
diff --git a/source/app/web/statics/oauth/index.html b/source/app/web/statics/oauth/index.html
index a0d63e6e3dc..ef82837b77f 100644
--- a/source/app/web/statics/oauth/index.html
+++ b/source/app/web/statics/oauth/index.html
@@ -8,9 +8,9 @@
     <meta name="author" content="lowlighter">
     <meta property="og:image" content="/.opengraph.png">
     <link rel="icon" href="/.favicon.png">
-    <link rel="stylesheet" href="/.css/style.vars.css?v=3.33">
-    <link rel="stylesheet" href="/.css/style.css?v=3.33">
-    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.33">
+    <link rel="stylesheet" href="/.css/style.vars.css?v=3.34">
+    <link rel="stylesheet" href="/.css/style.css?v=3.34">
+    <link rel="stylesheet" href="/insights/.statics/style.css?v=3.34">
   </head>
   <body>
     <!-- Vue app -->
@@ -105,6 +105,6 @@
     <!-- Scripts -->
     <script src="/.js/axios.min.js"></script>
     <script src="/.js/vue.min.js"></script>
-    <script src="/.oauth/script.js?v=3.33"></script>
+    <script src="/.oauth/script.js?v=3.34"></script>
   </body>
 </html>

From d4fa115fb6bc3380c3e684e07b0c5aab568504b9 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 29 Mar 2023 19:28:55 -0400
Subject: [PATCH 125/196] chore(deps): upgrade

---
 package-lock.json | 85 ++++++++++++++++++++++++++++-------------------
 package.json      |  6 ++--
 2 files changed, 54 insertions(+), 37 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 6c28a0040eb..98b62c48629 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -22,7 +22,7 @@
         "clipboard": "^2.0.11",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
-        "d3": "^7.8.2",
+        "d3": "^7.8.3",
         "ejs": "^3.1.9",
         "emoji-name-map": "^1.2.9",
         "express": "^4.18.2",
@@ -33,12 +33,12 @@
         "linguist-js": "^2.5.4",
         "marked": "^4.3.0",
         "memory-cache": "^0.2.0",
-        "minimatch": "^7.4.2",
+        "minimatch": "^7.4.3",
         "node-fetch": "^3.3.1",
         "open-graph-scraper": "^5.2.3",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^19.8.0",
+        "puppeteer": "^19.8.2",
         "purgecss": "^5.0.0",
         "rss-parser": "^3.12.0",
         "sanitize-html": "^2.10.0",
@@ -1942,6 +1942,35 @@
         "@primer/behaviors": "^1.2.0"
       }
     },
+    "node_modules/@puppeteer/browsers": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-0.3.1.tgz",
+      "integrity": "sha512-WTFVqWY7ipI+CsJRb6vEddYJ/lMl2bHYP5BjFDBM9JMKPjJNT4psXz6DLuJpi3EkG80Q0ef5Azzv3gKu9MvMUg==",
+      "dependencies": {
+        "debug": "4.3.4",
+        "extract-zip": "2.0.1",
+        "https-proxy-agent": "5.0.1",
+        "progress": "2.0.3",
+        "proxy-from-env": "1.1.0",
+        "tar-fs": "2.1.1",
+        "unbzip2-stream": "1.4.3",
+        "yargs": "17.7.1"
+      },
+      "bin": {
+        "browsers": "lib/cjs/main-cli.js"
+      },
+      "engines": {
+        "node": ">=14.1.0"
+      },
+      "peerDependencies": {
+        "typescript": ">= 4.7.4"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@sinclair/typebox": {
       "version": "0.25.24",
       "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
@@ -2277,7 +2306,6 @@
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
       "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
-      "devOptional": true,
       "engines": {
         "node": ">=8"
       }
@@ -2833,9 +2861,9 @@
       }
     },
     "node_modules/chromium-bidi": {
-      "version": "0.4.5",
-      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.5.tgz",
-      "integrity": "sha512-rkav9YzRfAshSTG3wNXF7P7yNiI29QAo1xBXElPoCoSQR5n20q3cOyVhDv6S7+GlF/CJ/emUxlQiR0xOPurkGg==",
+      "version": "0.4.6",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.6.tgz",
+      "integrity": "sha512-TQOkWRaLI/IWvoP8XC+7jO4uHTIiAUiklXU1T0qszlUFEai9LgKXIBXy3pOS3EnQZ3bQtMbKUPkug0fTAEHCSw==",
       "dependencies": {
         "mitt": "3.0.0"
       },
@@ -2878,7 +2906,6 @@
       "version": "8.0.1",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
       "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
-      "dev": true,
       "dependencies": {
         "string-width": "^4.2.0",
         "strip-ansi": "^6.0.1",
@@ -3253,9 +3280,9 @@
       "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
     },
     "node_modules/d3": {
-      "version": "7.8.2",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz",
-      "integrity": "sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==",
+      "version": "7.8.3",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.3.tgz",
+      "integrity": "sha512-cAa866AkPXtt4IzRx6nzGf50uerq6VYks7p/tTH94be4QfhUkyTfJfaxXGPOB5ZRVUZmUV1wcM1dism/Ua0lCw==",
       "dependencies": {
         "d3-array": "3",
         "d3-axis": "3",
@@ -3951,8 +3978,7 @@
     "node_modules/emoji-regex": {
       "version": "8.0.0",
       "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-      "devOptional": true
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
     },
     "node_modules/emojilib": {
       "version": "2.4.0",
@@ -3998,7 +4024,6 @@
       "version": "3.1.1",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
       "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
-      "dev": true,
       "engines": {
         "node": ">=6"
       }
@@ -4801,7 +4826,6 @@
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true,
       "engines": {
         "node": "6.* || 8.* || >= 10.*"
       }
@@ -5258,7 +5282,6 @@
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-      "devOptional": true,
       "engines": {
         "node": ">=8"
       }
@@ -6418,9 +6441,9 @@
       }
     },
     "node_modules/minimatch": {
-      "version": "7.4.2",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.2.tgz",
-      "integrity": "sha512-xy4q7wou3vUoC9k1xGTXc+awNdGaGVHtFUaey8tiX4H1QRc04DZ/rmDFwNm2EBsuYEhAZ6SgMmYf3InGY6OauA==",
+      "version": "7.4.3",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.3.tgz",
+      "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
@@ -7238,24 +7261,25 @@
       }
     },
     "node_modules/puppeteer": {
-      "version": "19.8.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.8.0.tgz",
-      "integrity": "sha512-MpQClmttCUxv4bVokX/YSXLCU12CUApuRf0rIJyGknYcIrDQNkLUx1N7hNt88Ya4lq9VDsdiDEJ3bcPijqJYPQ==",
+      "version": "19.8.2",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.8.2.tgz",
+      "integrity": "sha512-LPdNVYMR6ddp4YS3GK1bqKsasCJj1aZjt9dNOKcnzKezuMoishlHY6bCnFLjTc34iqnGzIrJp07TQ9M+aML2+g==",
       "hasInstallScript": true,
       "dependencies": {
+        "@puppeteer/browsers": "0.3.1",
         "cosmiconfig": "8.1.3",
         "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
         "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.8.0"
+        "puppeteer-core": "19.8.1"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "19.8.0",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.8.0.tgz",
-      "integrity": "sha512-5gBkLR9nae7chWDhI3mpj5QA+hPmjEOW29qw5ap5g51Uo5Lxe5Yip1uyQwZSjg5Wn/eyE9grh2Lyx3m8rPK90A==",
+      "version": "19.8.1",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.8.1.tgz",
+      "integrity": "sha512-7yPMzusYRvJ/laLaMFIQ01E9WakKkJJXLsMAymH6y5EKqYe5hhn68/SbvF+1YJMb843GftU7gT86Fw8y5jkn3w==",
       "dependencies": {
-        "chromium-bidi": "0.4.5",
+        "chromium-bidi": "0.4.6",
         "cross-fetch": "3.1.5",
         "debug": "4.3.4",
         "devtools-protocol": "0.0.1107588",
@@ -7514,7 +7538,6 @@
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
       "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
-      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -8160,7 +8183,6 @@
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
       "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
-      "devOptional": true,
       "dependencies": {
         "emoji-regex": "^8.0.0",
         "is-fullwidth-code-point": "^3.0.0",
@@ -8174,7 +8196,6 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
       "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
-      "devOptional": true,
       "dependencies": {
         "ansi-regex": "^5.0.1"
       },
@@ -8773,7 +8794,6 @@
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
       "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
-      "dev": true,
       "dependencies": {
         "ansi-styles": "^4.0.0",
         "string-width": "^4.1.0",
@@ -8886,7 +8906,6 @@
       "version": "5.0.8",
       "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
-      "dev": true,
       "engines": {
         "node": ">=10"
       }
@@ -8901,7 +8920,6 @@
       "version": "17.7.1",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
       "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
-      "dev": true,
       "dependencies": {
         "cliui": "^8.0.1",
         "escalade": "^3.1.1",
@@ -8919,7 +8937,6 @@
       "version": "21.1.1",
       "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
       "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
-      "devOptional": true,
       "engines": {
         "node": ">=12"
       }
diff --git a/package.json b/package.json
index 6cb177b86c8..31a5bd2034a 100644
--- a/package.json
+++ b/package.json
@@ -41,7 +41,7 @@
     "clipboard": "^2.0.11",
     "compression": "^1.7.4",
     "csso": "^5.0.5",
-    "d3": "^7.8.2",
+    "d3": "^7.8.3",
     "ejs": "^3.1.9",
     "emoji-name-map": "^1.2.9",
     "express": "^4.18.2",
@@ -52,12 +52,12 @@
     "linguist-js": "^2.5.4",
     "marked": "^4.3.0",
     "memory-cache": "^0.2.0",
-    "minimatch": "^7.4.2",
+    "minimatch": "^7.4.3",
     "node-fetch": "^3.3.1",
     "open-graph-scraper": "^5.2.3",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^19.8.0",
+    "puppeteer": "^19.8.2",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.12.0",
     "sanitize-html": "^2.10.0",

From 9ca8b85fb83105e0db789e8a47c1688bd8b74754 Mon Sep 17 00:00:00 2001
From: CCXXXI <ccxxxi@qq.com>
Date: Thu, 30 Mar 2023 07:30:12 +0800
Subject: [PATCH 126/196] docs(steam): correct `plugin_steam_user` example
 (#1413)

---
 source/plugins/steam/examples.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/source/plugins/steam/examples.yml b/source/plugins/steam/examples.yml
index 8a125ba7ad6..6530d09ffc5 100644
--- a/source/plugins/steam/examples.yml
+++ b/source/plugins/steam/examples.yml
@@ -6,7 +6,7 @@
     base: ""
     plugin_steam_token: ${{ secrets.STEAM_TOKEN }}
     plugin_steam: yes
-    plugin_steam_user: 0
+    plugin_steam_user: "0"
     plugin_steam_sections: recently-played
     plugin_steam_achievements_limit: 0
   prod:
@@ -23,7 +23,7 @@
     base: ""
     plugin_steam_token: ${{ secrets.STEAM_TOKEN }}
     plugin_steam: yes
-    plugin_steam_user: 0
+    plugin_steam_user: "0"
   prod:
     # ⚠️ Using mocked data for privacy reasons
     with:

From dfa586b448b8294663f041e1feae2992154a503a Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 29 Mar 2023 19:58:02 -0400
Subject: [PATCH 127/196] fix: community template quickstart

---
 .github/scripts/quickstart/template/image.svg    |  2 +-
 .../scripts/quickstart/template/partials/_.json  |  4 +---
 .../quickstart/template/partials/hello.ejs       | 16 ++++++++++++++++
 3 files changed, 18 insertions(+), 4 deletions(-)
 create mode 100644 .github/scripts/quickstart/template/partials/hello.ejs

diff --git a/.github/scripts/quickstart/template/image.svg b/.github/scripts/quickstart/template/image.svg
index 8865376cef9..ad470c0df15 100644
--- a/.github/scripts/quickstart/template/image.svg
+++ b/.github/scripts/quickstart/template/image.svg
@@ -2,7 +2,7 @@
 
   <defs><style><%%= fonts %></style></defs>
   <style data-optimizable="true"><%%= style %></style>
-  <style><%= extras.css %></style>
+  <style><%%= extras.css %></style>
 
   <foreignObject x="0" y="0" width="100%" height="100%">
     <div xmlns="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink">
diff --git a/.github/scripts/quickstart/template/partials/_.json b/.github/scripts/quickstart/template/partials/_.json
index bca1b076c86..52ab9e3e40d 100644
--- a/.github/scripts/quickstart/template/partials/_.json
+++ b/.github/scripts/quickstart/template/partials/_.json
@@ -1,5 +1,3 @@
 [
-  "base.header",
-  "base.activity+community",
-  "base.repositories"
+  "hello"
 ]
\ No newline at end of file
diff --git a/.github/scripts/quickstart/template/partials/hello.ejs b/.github/scripts/quickstart/template/partials/hello.ejs
new file mode 100644
index 00000000000..7b3e54c9187
--- /dev/null
+++ b/.github/scripts/quickstart/template/partials/hello.ejs
@@ -0,0 +1,16 @@
+<section>
+  <h2 class="field">
+    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16"><path d="M11.134 1.535c.7-.509 1.416-.942 2.076-1.155.649-.21 1.463-.267 2.069.34.603.601.568 1.411.368 2.07-.202.668-.624 1.39-1.125 2.096-1.011 1.424-2.496 2.987-3.775 4.249-1.098 1.084-2.132 1.839-3.04 2.3a3.744 3.744 0 0 1-1.055 3.217c-.431.431-1.065.691-1.657.861-.614.177-1.294.287-1.914.357A21.151 21.151 0 0 1 .797 16H.743l.007-.75H.749L.742 16a.75.75 0 0 1-.743-.742l.743-.008-.742.007v-.054a21.25 21.25 0 0 1 .13-2.284c.067-.647.187-1.287.358-1.914.17-.591.43-1.226.86-1.657a3.746 3.746 0 0 1 3.227-1.054c.466-.893 1.225-1.907 2.314-2.982 1.271-1.255 2.833-2.75 4.245-3.777ZM1.62 13.089c-.051.464-.086.929-.104 1.395.466-.018.932-.053 1.396-.104a10.511 10.511 0 0 0 1.668-.309c.526-.151.856-.325 1.011-.48a2.25 2.25 0 1 0-3.182-3.182c-.155.155-.329.485-.48 1.01a10.515 10.515 0 0 0-.309 1.67Zm10.396-10.34c-1.224.89-2.605 2.189-3.822 3.384l1.718 1.718c1.21-1.205 2.51-2.597 3.387-3.833.47-.662.78-1.227.912-1.662.134-.444.032-.551.009-.575h-.001V1.78c-.014-.014-.113-.113-.548.027-.432.14-.995.462-1.655.942Zm-4.832 7.266-.001.001a9.859 9.859 0 0 0 1.63-1.142L7.155 7.216a9.7 9.7 0 0 0-1.161 1.607c.482.302.889.71 1.19 1.192Z"></path></svg>
+    Community templates
+  </h2>
+  <div style="margin: 0px 12px">
+    <p>
+      Use HTML tags, CSS styles and EJS templates to customize this template.
+      Any data fetched and exposed by plugins can be displayed here.
+    </p>
+    <p>
+      For example, to display user's login, use <code><%%= "<"+"%"+"=" %> user.login <%%= "%"+">" %></code>,
+      which will be rendered as <code><%%= user.login %></code>.
+    </p>
+  </div>
+</section>
\ No newline at end of file

From 69f6871c24eb50993ab9ed2092a38859ea30589c Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 29 Mar 2023 20:15:52 -0400
Subject: [PATCH 128/196] ci: auto-regenerate files

---
 .github/workflows/examples.yml                |  4 +--
 README.md                                     |  2 ++
 .../community/16personalities/README.md       | 12 +++------
 source/plugins/leetcode/README.md             |  3 +--
 source/plugins/stargazers/README.md           |  3 +--
 source/plugins/steam/README.md                | 27 +++++++------------
 tests/cases/steam.plugin.yml                  |  4 +--
 7 files changed, 21 insertions(+), 34 deletions(-)

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 63e504c2501..ad43189459d 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -1136,7 +1136,7 @@ jobs:
           base: ""
           plugin_steam_token: MOCKED_TOKEN
           plugin_steam: yes
-          plugin_steam_user: 0
+          plugin_steam_user: "0"
           plugin_steam_sections: recently-played
           plugin_steam_achievements_limit: 0
           use_mocked_data: yes
@@ -1153,7 +1153,7 @@ jobs:
           base: ""
           plugin_steam_token: MOCKED_TOKEN
           plugin_steam: yes
-          plugin_steam_user: 0
+          plugin_steam_user: "0"
           use_mocked_data: yes
           output_action: none
           delay: 120
diff --git a/README.md b/README.md
index 96e6094500c..fe63843a3d9 100644
--- a/README.md
+++ b/README.md
@@ -448,6 +448,8 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
 # 📚 Documentation
 
 
+> <sup>*⚠️ This is the documentation of **v3.34-beta** (`@master`/`@main` branches) which includes [unreleased features](https://github.com/lowlighter/metrics/compare/latest...master) planned for next release. See documentation for current released version [**v3.33** (`@latest` branch) here](https://github.com/lowlighter/metrics/blob/latest/README.md).* </sup>
+
 
 
 ## 🦮 Setup
diff --git a/source/plugins/community/16personalities/README.md b/source/plugins/community/16personalities/README.md
index 734953cc1a8..50b64edd85d 100644
--- a/source/plugins/community/16personalities/README.md
+++ b/source/plugins/community/16personalities/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -58,8 +57,7 @@ Login with the generated password received in your mailbox and copy the link tha
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -73,8 +71,7 @@ Login with the generated password received in your mailbox and copy the link tha
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> personality<br>
@@ -86,8 +83,7 @@ Login with the generated password received in your mailbox and copy the link tha
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/leetcode/README.md b/source/plugins/leetcode/README.md
index 5d231b41287..896b56ed086 100644
--- a/source/plugins/leetcode/README.md
+++ b/source/plugins/leetcode/README.md
@@ -91,8 +91,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <br></td>
   </tr>
   <tr>
diff --git a/source/plugins/stargazers/README.md b/source/plugins/stargazers/README.md
index f960e872d45..a554e60aecf 100644
--- a/source/plugins/stargazers/README.md
+++ b/source/plugins/stargazers/README.md
@@ -63,8 +63,7 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
diff --git a/source/plugins/steam/README.md b/source/plugins/steam/README.md
index a2c5fec7e8c..32b33db0e40 100644
--- a/source/plugins/steam/README.md
+++ b/source/plugins/steam/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,7 +51,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.steam</i></li>
@@ -71,8 +69,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> player, most-played, recently-played<br></td>
@@ -85,7 +82,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -96,8 +92,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -107,8 +102,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -121,8 +115,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -135,8 +128,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -148,8 +140,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -180,7 +171,7 @@ with:
   base: ""
   plugin_steam_token: ${{ secrets.STEAM_TOKEN }}
   plugin_steam: yes
-  plugin_steam_user: 0
+  plugin_steam_user: "0"
   plugin_steam_sections: recently-played
   plugin_steam_achievements_limit: 0
 
@@ -194,7 +185,7 @@ with:
   base: ""
   plugin_steam_token: ${{ secrets.STEAM_TOKEN }}
   plugin_steam: yes
-  plugin_steam_user: 0
+  plugin_steam_user: "0"
 
 ```
 <!--/examples-->
diff --git a/tests/cases/steam.plugin.yml b/tests/cases/steam.plugin.yml
index 7062aaf09da..f1099638c9f 100644
--- a/tests/cases/steam.plugin.yml
+++ b/tests/cases/steam.plugin.yml
@@ -4,7 +4,7 @@
     token: NOT_NEEDED
     plugin_steam_token: MOCKED_TOKEN
     plugin_steam: 'yes'
-    plugin_steam_user: 0
+    plugin_steam_user: '0'
     plugin_steam_sections: recently-played
     plugin_steam_achievements_limit: 0
     use_mocked_data: 'yes'
@@ -15,6 +15,6 @@
     token: NOT_NEEDED
     plugin_steam_token: MOCKED_TOKEN
     plugin_steam: 'yes'
-    plugin_steam_user: 0
+    plugin_steam_user: '0'
     use_mocked_data: 'yes'
     verify: 'yes'

From 6f50ff8c834be88d5c20f3a1993f222f2a2fa3e3 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 17 Apr 2023 20:15:22 -0400
Subject: [PATCH 129/196] chore(deps): bump rss-parser from 3.12.0 to 3.13.0
 (#1424) [skip ci]

---
 package-lock.json | 16 ++++++++--------
 package.json      |  2 +-
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 98b62c48629..38ebe2bf9bb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -40,7 +40,7 @@
         "prismjs": "^1.29.0",
         "puppeteer": "^19.8.2",
         "purgecss": "^5.0.0",
-        "rss-parser": "^3.12.0",
+        "rss-parser": "^3.13.0",
         "sanitize-html": "^2.10.0",
         "sharp": "^0.32.0",
         "simple-git": "^3.17.0",
@@ -7679,12 +7679,12 @@
       }
     },
     "node_modules/rss-parser": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.12.0.tgz",
-      "integrity": "sha512-aqD3E8iavcCdkhVxNDIdg1nkBI17jgqF+9OqPS1orwNaOgySdpvq6B+DoONLhzjzwV8mWg37sb60e4bmLK117A==",
+      "version": "3.13.0",
+      "resolved": "https://registry.npmjs.org/rss-parser/-/rss-parser-3.13.0.tgz",
+      "integrity": "sha512-7jWUBV5yGN3rqMMj7CZufl/291QAhvrrGpDNE4k/02ZchL0npisiYYqULF71jCEKoIiHvK/Q2e6IkDwPziT7+w==",
       "dependencies": {
         "entities": "^2.0.3",
-        "xml2js": "^0.4.19"
+        "xml2js": "^0.5.0"
       }
     },
     "node_modules/rss-parser/node_modules/entities": {
@@ -8878,9 +8878,9 @@
       }
     },
     "node_modules/xml2js": {
-      "version": "0.4.23",
-      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
-      "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz",
+      "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==",
       "dependencies": {
         "sax": ">=0.6.0",
         "xmlbuilder": "~11.0.0"
diff --git a/package.json b/package.json
index 31a5bd2034a..aa78a795c5b 100644
--- a/package.json
+++ b/package.json
@@ -59,7 +59,7 @@
     "prismjs": "^1.29.0",
     "puppeteer": "^19.8.2",
     "purgecss": "^5.0.0",
-    "rss-parser": "^3.12.0",
+    "rss-parser": "^3.13.0",
     "sanitize-html": "^2.10.0",
     "sharp": "^0.32.0",
     "simple-git": "^3.17.0",

From 7d221e8d3cc14a47f059318b3934f13cefa29dca Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 17 Apr 2023 20:15:30 -0400
Subject: [PATCH 130/196] chore(deps): bump xml2js and rss-parser (#1422) [skip
 ci]


From f10ffca8e87f77d917e0260fb0289bcff2b36c76 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 17 Apr 2023 20:15:40 -0400
Subject: [PATCH 131/196] chore(deps): bump eslint from 8.36.0 to 8.38.0
 (#1421) [skip ci]

---
 package-lock.json | 47 +++++++++++++++++++++++++----------------------
 package.json      |  2 +-
 2 files changed, 26 insertions(+), 23 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 38ebe2bf9bb..ba46345c25e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -51,7 +51,7 @@
       },
       "devDependencies": {
         "dprint": "^0.35.1",
-        "eslint": "^8.35.0",
+        "eslint": "^8.38.0",
         "jest": "^29.5.0"
       },
       "optionalDependencies": {
@@ -719,14 +719,14 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
-      "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz",
+      "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
-        "espree": "^9.5.0",
+        "espree": "^9.5.1",
         "globals": "^13.19.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
@@ -764,9 +764,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
-      "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz",
+      "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -4113,15 +4113,15 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.36.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
-      "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
+      "version": "8.38.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz",
+      "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.4.0",
-        "@eslint/eslintrc": "^2.0.1",
-        "@eslint/js": "8.36.0",
+        "@eslint/eslintrc": "^2.0.2",
+        "@eslint/js": "8.38.0",
         "@humanwhocodes/config-array": "^0.11.8",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
@@ -4132,8 +4132,8 @@
         "doctrine": "^3.0.0",
         "escape-string-regexp": "^4.0.0",
         "eslint-scope": "^7.1.1",
-        "eslint-visitor-keys": "^3.3.0",
-        "espree": "^9.5.0",
+        "eslint-visitor-keys": "^3.4.0",
+        "espree": "^9.5.1",
         "esquery": "^1.4.2",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -4183,12 +4183,15 @@
       }
     },
     "node_modules/eslint-visitor-keys": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
-      "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
+      "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
     "node_modules/eslint/node_modules/brace-expansion": {
@@ -4214,14 +4217,14 @@
       }
     },
     "node_modules/espree": {
-      "version": "9.5.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
-      "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
+      "version": "9.5.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz",
+      "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==",
       "dev": true,
       "dependencies": {
         "acorn": "^8.8.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.3.0"
+        "eslint-visitor-keys": "^3.4.0"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
diff --git a/package.json b/package.json
index aa78a795c5b..4b798bb4da7 100644
--- a/package.json
+++ b/package.json
@@ -70,7 +70,7 @@
   },
   "devDependencies": {
     "dprint": "^0.35.1",
-    "eslint": "^8.35.0",
+    "eslint": "^8.38.0",
     "jest": "^29.5.0"
   },
   "jest": {

From f6c4f63ecfbc342039ad33651e74a8519989b380 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 17 Apr 2023 20:15:48 -0400
Subject: [PATCH 132/196] chore(deps): bump @primer/css from 20.8.3 to 21.0.0
 (#1418) [skip ci]

---
 package-lock.json | 42 ++++++++++++++++++++++++------------------
 package.json      |  2 +-
 2 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index ba46345c25e..32a1bc40dbb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,7 +15,7 @@
         "@faker-js/faker": "^7.6.0",
         "@octokit/graphql": "^5.0.5",
         "@octokit/rest": "^19.0.7",
-        "@primer/css": "^20.8.3",
+        "@primer/css": "^21.0.0",
         "@primer/octicons": "^18.3.0",
         "@twemoji/parser": "^14.1.0",
         "axios": "^1.3.4",
@@ -795,9 +795,9 @@
       "integrity": "sha512-1fzCDXpxI4J59pNmO0r0Y1g+R8Sa2B5ersce8AuFu5STMu7b++9osdedK0zWduYowBIgsPQZihJBN19WrAF64g=="
     },
     "node_modules/@github/auto-complete-element": {
-      "version": "3.3.4",
-      "resolved": "https://registry.npmjs.org/@github/auto-complete-element/-/auto-complete-element-3.3.4.tgz",
-      "integrity": "sha512-b9SBCLIQGfCI3G0pGYE8rBSUDON5iFKUgHXgAtVdgZii0dnLFxNl5tn1R/RaBEFdzBQPDl9vqu41TF/Hs3w8FA==",
+      "version": "3.4.0",
+      "resolved": "https://registry.npmjs.org/@github/auto-complete-element/-/auto-complete-element-3.4.0.tgz",
+      "integrity": "sha512-iJ5D/0rwhPnoGPqFNWhY5NlJlxZKt/lMnIRuL6TRfJqu4ieDApWQdcVfJ0yPRDKAzJqmb0MgMkOtH84ZBLu9og==",
       "dependencies": {
         "@github/combobox-nav": "^2.0.2"
       }
@@ -833,9 +833,9 @@
       "integrity": "sha512-iEeR2OdVCPkdIPUszL8gJnKNu4MR8ANh7y0u/LPyaatYezgaWxUZEzhFntloqQq+HE6MZkFy+cl+xzCNuljOdw=="
     },
     "node_modules/@github/relative-time-element": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.2.3.tgz",
-      "integrity": "sha512-M5NaacbpSmKUk6tYQ8r/LokSHeIb6D7rTTOqZ/htQX3b7KGKiDXI0t/WF7UDy58Go0NNfEahE9WzGEKcSjqfrA=="
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.2.4.tgz",
+      "integrity": "sha512-18qgH9FYUHYN9K3z4s35auDHww1dKTU6TacI8JkA5OuvHVa1lTMuSTZ4hIoJngD5+mizcoRMOs6p/yZYMIjsyg=="
     },
     "node_modules/@github/tab-container-element": {
       "version": "3.2.0",
@@ -1895,18 +1895,23 @@
         "@octokit/openapi-types": "^12.11.0"
       }
     },
+    "node_modules/@oddbird/popover-polyfill": {
+      "version": "0.0.10",
+      "resolved": "https://registry.npmjs.org/@oddbird/popover-polyfill/-/popover-polyfill-0.0.10.tgz",
+      "integrity": "sha512-jkfX/35EsxDe9ruTx3He59FyE+y5WDF5S4YJ7TABj0c8egHV2FLeADavknvr12CnSu0QTybv9ufKfPJDsYZYNw=="
+    },
     "node_modules/@primer/behaviors": {
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.3.tgz",
       "integrity": "sha512-iHMRuu8YWDJIdqCi1krx0cyFNeqszNKTOb0dXFu2wQ5BeIqxqPJLD7rjZ2Vjf/+YaPSbWuIQE1H6TaGMMsDfdA=="
     },
     "node_modules/@primer/css": {
-      "version": "20.8.3",
-      "resolved": "https://registry.npmjs.org/@primer/css/-/css-20.8.3.tgz",
-      "integrity": "sha512-jXF6l3Cjks6PkWTKbSkrg2h/pE+w/HVXZCpDkLcZB3P1d1cAaK8LXeVVBVWSjnKWIMfiNzyHcx1CTUtj5T4Ivg==",
+      "version": "21.0.0",
+      "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.0.tgz",
+      "integrity": "sha512-bIiBv/qKUzYMoy9dDeAM2qOHBj/AX/1obG0Cbwcg2mCFBhfxIGl49AOyMx3EcYNDPO86ZHPFhF91gYUvlguKiQ==",
       "dependencies": {
-        "@primer/primitives": "^7.11.1",
-        "@primer/view-components": "^0.0.120"
+        "@primer/primitives": "^7.11.3",
+        "@primer/view-components": "^0.1.0"
       },
       "engines": {
         "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
@@ -1921,14 +1926,14 @@
       }
     },
     "node_modules/@primer/primitives": {
-      "version": "7.11.1",
-      "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.11.1.tgz",
-      "integrity": "sha512-Sdss4XG96nqBqrTAyg+RuFOj+U5wkICK8n2hafcyT+lpSlZoIwcbmhyFjmDy9f88FkhHe2q0uCpQ8PjKd8ILTQ=="
+      "version": "7.11.3",
+      "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.11.3.tgz",
+      "integrity": "sha512-od+rjE04X5sAtGncn9v7/ehZS2O9/tBpQpRsNirU5d4EuOwWMXTt3c6zMBkke136jbmJ0VbGhU+DrLwhj0AM9w=="
     },
     "node_modules/@primer/view-components": {
-      "version": "0.0.120",
-      "resolved": "https://registry.npmjs.org/@primer/view-components/-/view-components-0.0.120.tgz",
-      "integrity": "sha512-C90cNtB3Zl8B+nLPkztYYMBNTaGxUWLrVroG3a8dIEcpGdEZOhsOPOfeptpyPMolX7DWag/hfzBXBp0i7TawDg==",
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/@primer/view-components/-/view-components-0.1.4.tgz",
+      "integrity": "sha512-Z5rqs84o7Qox0pEMe5LJW5C/Pgn/YMV7cRjaWJxwvPrlMGtBIk1ds7IcgymcEH2DY/6Jvsm4WQIEwA2AIiHVlg==",
       "dependencies": {
         "@github/auto-check-element": "^5.2.0",
         "@github/auto-complete-element": "^3.3.4",
@@ -1939,6 +1944,7 @@
         "@github/mini-throttle": "^2.1.0",
         "@github/relative-time-element": "^4.0.0",
         "@github/tab-container-element": "^3.1.2",
+        "@oddbird/popover-polyfill": "^0.0.10",
         "@primer/behaviors": "^1.2.0"
       }
     },
diff --git a/package.json b/package.json
index 4b798bb4da7..c0ceab442c5 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
     "@faker-js/faker": "^7.6.0",
     "@octokit/graphql": "^5.0.5",
     "@octokit/rest": "^19.0.7",
-    "@primer/css": "^20.8.3",
+    "@primer/css": "^21.0.0",
     "@primer/octicons": "^18.3.0",
     "@twemoji/parser": "^14.1.0",
     "axios": "^1.3.4",

From 34cb7a96b624ca9c63214136eec2c1f37466e595 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 24 Jul 2023 13:02:29 -0400
Subject: [PATCH 133/196] chore(deps): upgrade dependencies

---
 package-lock.json | 2444 +++++++++++++++++++++++----------------------
 package.json      |   48 +-
 2 files changed, 1287 insertions(+), 1205 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 32a1bc40dbb..03640485900 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,58 +12,67 @@
       "dependencies": {
         "@actions/core": "^1.10.0",
         "@actions/github": "^5.1.1",
-        "@faker-js/faker": "^7.6.0",
-        "@octokit/graphql": "^5.0.5",
-        "@octokit/rest": "^19.0.7",
-        "@primer/css": "^21.0.0",
-        "@primer/octicons": "^18.3.0",
+        "@faker-js/faker": "^8.0.2",
+        "@octokit/graphql": "^7.0.1",
+        "@octokit/rest": "^20.0.1",
+        "@primer/css": "^21.0.7",
+        "@primer/octicons": "^19.4.0",
         "@twemoji/parser": "^14.1.0",
-        "axios": "^1.3.4",
+        "axios": "^1.4.0",
         "clipboard": "^2.0.11",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
-        "d3": "^7.8.3",
+        "d3": "^7.8.5",
         "ejs": "^3.1.9",
         "emoji-name-map": "^1.2.9",
         "express": "^4.18.2",
-        "express-rate-limit": "^6.7.0",
-        "file-type": "^18.2.1",
+        "express-rate-limit": "^6.8.0",
+        "file-type": "^18.5.0",
         "js-yaml": "^4.1.0",
-        "jsdom": "^21.1.1",
-        "linguist-js": "^2.5.4",
-        "marked": "^4.3.0",
+        "jsdom": "^22.1.0",
+        "linguist-js": "^2.6.1",
+        "marked": "^5.1.1",
         "memory-cache": "^0.2.0",
-        "minimatch": "^7.4.3",
+        "minimatch": "^9.0.3",
         "node-fetch": "^3.3.1",
-        "open-graph-scraper": "^5.2.3",
+        "open-graph-scraper": "^6.2.2",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^19.8.2",
+        "puppeteer": "^20.9.0",
         "purgecss": "^5.0.0",
         "rss-parser": "^3.13.0",
-        "sanitize-html": "^2.10.0",
-        "sharp": "^0.32.0",
-        "simple-git": "^3.17.0",
+        "sanitize-html": "^2.11.0",
+        "sharp": "^0.32.4",
+        "simple-git": "^3.19.1",
         "svgo": "^3.0.2",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
-        "xml-formatter": "^3.3.2"
+        "xml-formatter": "^3.4.1"
       },
       "devDependencies": {
         "dprint": "^0.35.1",
-        "eslint": "^8.38.0",
-        "jest": "^29.5.0"
+        "eslint": "^8.45.0",
+        "jest": "^29.6.1"
       },
       "optionalDependencies": {
-        "@googlemaps/google-maps-services-js": "^3.3.27",
-        "chess.js": "^1.0.0-beta.3",
+        "@googlemaps/google-maps-services-js": "^3.3.34",
+        "chess.js": "^1.0.0-beta.6",
         "color": "^4.2.3",
         "gifencoder": "^2.0.1",
-        "libxmljs2": "^0.31.0",
+        "libxmljs2": "^0.32.0",
         "rss": "^1.2.2",
         "yargs-parser": "^21.1.1"
       }
     },
+    "node_modules/@aashutoshrathi/word-wrap": {
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+      "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/@actions/core": {
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
@@ -93,12 +102,12 @@
       }
     },
     "node_modules/@ampproject/remapping": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
-      "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+      "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
       "dev": true,
       "dependencies": {
-        "@jridgewell/gen-mapping": "^0.1.0",
+        "@jridgewell/gen-mapping": "^0.3.0",
         "@jridgewell/trace-mapping": "^0.3.9"
       },
       "engines": {
@@ -106,46 +115,46 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
-      "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
+      "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
       "dependencies": {
-        "@babel/highlight": "^7.18.6"
+        "@babel/highlight": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/compat-data": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz",
-      "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==",
+      "version": "7.22.9",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz",
+      "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.0.tgz",
-      "integrity": "sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==",
+      "version": "7.22.9",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz",
+      "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==",
       "dev": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.21.0",
-        "@babel/helper-compilation-targets": "^7.20.7",
-        "@babel/helper-module-transforms": "^7.21.0",
-        "@babel/helpers": "^7.21.0",
-        "@babel/parser": "^7.21.0",
-        "@babel/template": "^7.20.7",
-        "@babel/traverse": "^7.21.0",
-        "@babel/types": "^7.21.0",
+        "@babel/code-frame": "^7.22.5",
+        "@babel/generator": "^7.22.9",
+        "@babel/helper-compilation-targets": "^7.22.9",
+        "@babel/helper-module-transforms": "^7.22.9",
+        "@babel/helpers": "^7.22.6",
+        "@babel/parser": "^7.22.7",
+        "@babel/template": "^7.22.5",
+        "@babel/traverse": "^7.22.8",
+        "@babel/types": "^7.22.5",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
         "json5": "^2.2.2",
-        "semver": "^6.3.0"
+        "semver": "^6.3.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -162,21 +171,21 @@
       "dev": true
     },
     "node_modules/@babel/core/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "dev": true,
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.21.1",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.1.tgz",
-      "integrity": "sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==",
+      "version": "7.22.9",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz",
+      "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.21.0",
+        "@babel/types": "^7.22.5",
         "@jridgewell/gen-mapping": "^0.3.2",
         "@jridgewell/trace-mapping": "^0.3.17",
         "jsesc": "^2.5.1"
@@ -185,31 +194,17 @@
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
-      "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
-      "dev": true,
-      "dependencies": {
-        "@jridgewell/set-array": "^1.0.1",
-        "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.9"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz",
-      "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==",
+      "version": "7.22.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz",
+      "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==",
       "dev": true,
       "dependencies": {
-        "@babel/compat-data": "^7.20.5",
-        "@babel/helper-validator-option": "^7.18.6",
-        "browserslist": "^4.21.3",
+        "@babel/compat-data": "^7.22.9",
+        "@babel/helper-validator-option": "^7.22.5",
+        "browserslist": "^4.21.9",
         "lru-cache": "^5.1.1",
-        "semver": "^6.3.0"
+        "semver": "^6.3.1"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -219,158 +214,158 @@
       }
     },
     "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "dev": true,
       "bin": {
         "semver": "bin/semver.js"
       }
     },
     "node_modules/@babel/helper-environment-visitor": {
-      "version": "7.18.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
-      "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
+      "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-function-name": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz",
-      "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
+      "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
       "dev": true,
       "dependencies": {
-        "@babel/template": "^7.20.7",
-        "@babel/types": "^7.21.0"
+        "@babel/template": "^7.22.5",
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-hoist-variables": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
-      "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.18.6"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-imports": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
-      "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
+      "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.18.6"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz",
-      "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==",
+      "version": "7.22.9",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz",
+      "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-module-imports": "^7.18.6",
-        "@babel/helper-simple-access": "^7.20.2",
-        "@babel/helper-split-export-declaration": "^7.18.6",
-        "@babel/helper-validator-identifier": "^7.19.1",
-        "@babel/template": "^7.20.7",
-        "@babel/traverse": "^7.21.2",
-        "@babel/types": "^7.21.2"
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-module-imports": "^7.22.5",
+        "@babel/helper-simple-access": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/helper-validator-identifier": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
       }
     },
     "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.20.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
-      "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+      "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-simple-access": {
-      "version": "7.20.2",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
-      "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.20.2"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-split-export-declaration": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
-      "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+      "version": "7.22.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+      "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.18.6"
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-string-parser": {
-      "version": "7.19.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
-      "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.19.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
-      "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
+      "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz",
-      "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
+      "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.21.0",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz",
-      "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==",
+      "version": "7.22.6",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz",
+      "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==",
       "dev": true,
       "dependencies": {
-        "@babel/template": "^7.20.7",
-        "@babel/traverse": "^7.21.0",
-        "@babel/types": "^7.21.0"
+        "@babel/template": "^7.22.5",
+        "@babel/traverse": "^7.22.6",
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
-      "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
+      "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
       "dependencies": {
-        "@babel/helper-validator-identifier": "^7.18.6",
+        "@babel/helper-validator-identifier": "^7.22.5",
         "chalk": "^2.0.0",
         "js-tokens": "^4.0.0"
       },
@@ -443,9 +438,9 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.2.tgz",
-      "integrity": "sha512-URpaIJQwEkEC2T9Kn+Ai6Xe/02iNaVCuT/PtoRz3GPVJVDpPd7mLo+VddTbhCRU9TXqW5mSrQfXZyi8kDKOVpQ==",
+      "version": "7.22.7",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
+      "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -514,12 +509,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-jsx": {
-      "version": "7.18.6",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
-      "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz",
+      "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.18.6"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -616,12 +611,12 @@
       }
     },
     "node_modules/@babel/plugin-syntax-typescript": {
-      "version": "7.20.0",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
-      "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz",
+      "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.19.0"
+        "@babel/helper-plugin-utils": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -631,33 +626,33 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.20.7",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz",
-      "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
+      "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
       "dev": true,
       "dependencies": {
-        "@babel/code-frame": "^7.18.6",
-        "@babel/parser": "^7.20.7",
-        "@babel/types": "^7.20.7"
+        "@babel/code-frame": "^7.22.5",
+        "@babel/parser": "^7.22.5",
+        "@babel/types": "^7.22.5"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.2.tgz",
-      "integrity": "sha512-ts5FFU/dSUPS13tv8XiEObDu9K+iagEKME9kAbaP7r0Y9KtZJZ+NGndDvWoRAYNpeWafbpFeki3q9QoMD6gxyw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.18.6",
-        "@babel/generator": "^7.21.1",
-        "@babel/helper-environment-visitor": "^7.18.9",
-        "@babel/helper-function-name": "^7.21.0",
-        "@babel/helper-hoist-variables": "^7.18.6",
-        "@babel/helper-split-export-declaration": "^7.18.6",
-        "@babel/parser": "^7.21.2",
-        "@babel/types": "^7.21.2",
+      "version": "7.22.8",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz",
+      "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==",
+      "dev": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.22.5",
+        "@babel/generator": "^7.22.7",
+        "@babel/helper-environment-visitor": "^7.22.5",
+        "@babel/helper-function-name": "^7.22.5",
+        "@babel/helper-hoist-variables": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/parser": "^7.22.7",
+        "@babel/types": "^7.22.5",
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       },
@@ -675,13 +670,13 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.21.2",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz",
-      "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==",
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
+      "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
       "dev": true,
       "dependencies": {
-        "@babel/helper-string-parser": "^7.19.4",
-        "@babel/helper-validator-identifier": "^7.19.1",
+        "@babel/helper-string-parser": "^7.22.5",
+        "@babel/helper-validator-identifier": "^7.22.5",
         "to-fast-properties": "^2.0.0"
       },
       "engines": {
@@ -719,14 +714,14 @@
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz",
-      "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
+      "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
         "debug": "^4.3.2",
-        "espree": "^9.5.1",
+        "espree": "^9.6.0",
         "globals": "^13.19.0",
         "ignore": "^5.2.0",
         "import-fresh": "^3.2.1",
@@ -764,21 +759,27 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz",
-      "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==",
+      "version": "8.44.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
+      "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
     "node_modules/@faker-js/faker": {
-      "version": "7.6.0",
-      "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-7.6.0.tgz",
-      "integrity": "sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==",
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/@faker-js/faker/-/faker-8.0.2.tgz",
+      "integrity": "sha512-Uo3pGspElQW91PCvKSIAXoEgAUlRnH29sX2/p89kg7sP1m2PzCufHINd0FhTXQf6DYGiUlVncdSPa2F9wxed2A==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/fakerjs"
+        }
+      ],
       "engines": {
-        "node": ">=14.0.0",
-        "npm": ">=6.0.0"
+        "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
+        "npm": ">=6.14.13"
       }
     },
     "node_modules/@github/auto-check-element": {
@@ -843,16 +844,16 @@
       "integrity": "sha512-to5ZJuywKK3KX53X1ifOcWjvUTQcBGdQ6Qkhm8L97xQ3ovICag1048M3YMpc+QSdr8xWeCBMnLeMnENqotB0Og=="
     },
     "node_modules/@googlemaps/google-maps-services-js": {
-      "version": "3.3.27",
-      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.27.tgz",
-      "integrity": "sha512-0MDcoqiLMzu4xPExrcm17fx89ZH5RgCg4J3pBokJURCzmF1XAIqNGO5zipcXl5QZOp+zhcrqC3Rl2k7rdd9p/Q==",
+      "version": "3.3.34",
+      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.34.tgz",
+      "integrity": "sha512-tx9pVpYmgleU5+oos6UGV9pshDkhZH0veCSZmjJpUhULIxTu5LbyTjNsIwbeLQmJW1/Pzph4lKsohsmx0Xu9pQ==",
       "optional": true,
       "dependencies": {
         "@googlemaps/url-signature": "^1.0.4",
         "agentkeepalive": "^4.1.0",
-        "axios": "0.27.2",
-        "query-string": "7.1.3",
-        "retry-axios": "2.6.0"
+        "axios": "^0.27.2",
+        "query-string": "^7.1.3",
+        "retry-axios": "^2.6.0"
       }
     },
     "node_modules/@googlemaps/google-maps-services-js/node_modules/axios": {
@@ -875,9 +876,9 @@
       }
     },
     "node_modules/@humanwhocodes/config-array": {
-      "version": "0.11.8",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
-      "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
+      "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
       "dev": true,
       "dependencies": {
         "@humanwhocodes/object-schema": "^1.2.1",
@@ -1028,12 +1029,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/@istanbuljs/load-nyc-config/node_modules/sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
-      "dev": true
-    },
     "node_modules/@istanbuljs/schema": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
@@ -1044,16 +1039,16 @@
       }
     },
     "node_modules/@jest/console": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz",
-      "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz",
+      "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.5.0",
+        "@jest/types": "^29.6.1",
         "@types/node": "*",
         "chalk": "^4.0.0",
-        "jest-message-util": "^29.5.0",
-        "jest-util": "^29.5.0",
+        "jest-message-util": "^29.6.1",
+        "jest-util": "^29.6.1",
         "slash": "^3.0.0"
       },
       "engines": {
@@ -1061,16 +1056,16 @@
       }
     },
     "node_modules/@jest/core": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz",
-      "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz",
+      "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.5.0",
-        "@jest/reporters": "^29.5.0",
-        "@jest/test-result": "^29.5.0",
-        "@jest/transform": "^29.5.0",
-        "@jest/types": "^29.5.0",
+        "@jest/console": "^29.6.1",
+        "@jest/reporters": "^29.6.1",
+        "@jest/test-result": "^29.6.1",
+        "@jest/transform": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
@@ -1078,20 +1073,20 @@
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
         "jest-changed-files": "^29.5.0",
-        "jest-config": "^29.5.0",
-        "jest-haste-map": "^29.5.0",
-        "jest-message-util": "^29.5.0",
+        "jest-config": "^29.6.1",
+        "jest-haste-map": "^29.6.1",
+        "jest-message-util": "^29.6.1",
         "jest-regex-util": "^29.4.3",
-        "jest-resolve": "^29.5.0",
-        "jest-resolve-dependencies": "^29.5.0",
-        "jest-runner": "^29.5.0",
-        "jest-runtime": "^29.5.0",
-        "jest-snapshot": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "jest-validate": "^29.5.0",
-        "jest-watcher": "^29.5.0",
+        "jest-resolve": "^29.6.1",
+        "jest-resolve-dependencies": "^29.6.1",
+        "jest-runner": "^29.6.1",
+        "jest-runtime": "^29.6.1",
+        "jest-snapshot": "^29.6.1",
+        "jest-util": "^29.6.1",
+        "jest-validate": "^29.6.1",
+        "jest-watcher": "^29.6.1",
         "micromatch": "^4.0.4",
-        "pretty-format": "^29.5.0",
+        "pretty-format": "^29.6.1",
         "slash": "^3.0.0",
         "strip-ansi": "^6.0.0"
       },
@@ -1108,37 +1103,37 @@
       }
     },
     "node_modules/@jest/environment": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz",
-      "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz",
+      "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==",
       "dev": true,
       "dependencies": {
-        "@jest/fake-timers": "^29.5.0",
-        "@jest/types": "^29.5.0",
+        "@jest/fake-timers": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "@types/node": "*",
-        "jest-mock": "^29.5.0"
+        "jest-mock": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/expect": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz",
-      "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz",
+      "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==",
       "dev": true,
       "dependencies": {
-        "expect": "^29.5.0",
-        "jest-snapshot": "^29.5.0"
+        "expect": "^29.6.1",
+        "jest-snapshot": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/expect-utils": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz",
-      "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz",
+      "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==",
       "dev": true,
       "dependencies": {
         "jest-get-type": "^29.4.3"
@@ -1148,49 +1143,49 @@
       }
     },
     "node_modules/@jest/fake-timers": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz",
-      "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz",
+      "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.5.0",
+        "@jest/types": "^29.6.1",
         "@sinonjs/fake-timers": "^10.0.2",
         "@types/node": "*",
-        "jest-message-util": "^29.5.0",
-        "jest-mock": "^29.5.0",
-        "jest-util": "^29.5.0"
+        "jest-message-util": "^29.6.1",
+        "jest-mock": "^29.6.1",
+        "jest-util": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/globals": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz",
-      "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz",
+      "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.5.0",
-        "@jest/expect": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "jest-mock": "^29.5.0"
+        "@jest/environment": "^29.6.1",
+        "@jest/expect": "^29.6.1",
+        "@jest/types": "^29.6.1",
+        "jest-mock": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/reporters": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz",
-      "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz",
+      "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==",
       "dev": true,
       "dependencies": {
         "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^29.5.0",
-        "@jest/test-result": "^29.5.0",
-        "@jest/transform": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@jridgewell/trace-mapping": "^0.3.15",
+        "@jest/console": "^29.6.1",
+        "@jest/test-result": "^29.6.1",
+        "@jest/transform": "^29.6.1",
+        "@jest/types": "^29.6.1",
+        "@jridgewell/trace-mapping": "^0.3.18",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "collect-v8-coverage": "^1.0.0",
@@ -1202,9 +1197,9 @@
         "istanbul-lib-report": "^3.0.0",
         "istanbul-lib-source-maps": "^4.0.0",
         "istanbul-reports": "^3.1.3",
-        "jest-message-util": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "jest-worker": "^29.5.0",
+        "jest-message-util": "^29.6.1",
+        "jest-util": "^29.6.1",
+        "jest-worker": "^29.6.1",
         "slash": "^3.0.0",
         "string-length": "^4.0.1",
         "strip-ansi": "^6.0.0",
@@ -1223,24 +1218,24 @@
       }
     },
     "node_modules/@jest/schemas": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
-      "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
+      "version": "29.6.0",
+      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz",
+      "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==",
       "dev": true,
       "dependencies": {
-        "@sinclair/typebox": "^0.25.16"
+        "@sinclair/typebox": "^0.27.8"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/source-map": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz",
-      "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==",
+      "version": "29.6.0",
+      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz",
+      "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==",
       "dev": true,
       "dependencies": {
-        "@jridgewell/trace-mapping": "^0.3.15",
+        "@jridgewell/trace-mapping": "^0.3.18",
         "callsites": "^3.0.0",
         "graceful-fs": "^4.2.9"
       },
@@ -1249,13 +1244,13 @@
       }
     },
     "node_modules/@jest/test-result": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz",
-      "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz",
+      "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.5.0",
-        "@jest/types": "^29.5.0",
+        "@jest/console": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "@types/istanbul-lib-coverage": "^2.0.0",
         "collect-v8-coverage": "^1.0.0"
       },
@@ -1264,14 +1259,14 @@
       }
     },
     "node_modules/@jest/test-sequencer": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz",
-      "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz",
+      "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==",
       "dev": true,
       "dependencies": {
-        "@jest/test-result": "^29.5.0",
+        "@jest/test-result": "^29.6.1",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.5.0",
+        "jest-haste-map": "^29.6.1",
         "slash": "^3.0.0"
       },
       "engines": {
@@ -1279,22 +1274,22 @@
       }
     },
     "node_modules/@jest/transform": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz",
-      "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz",
+      "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
-        "@jest/types": "^29.5.0",
-        "@jridgewell/trace-mapping": "^0.3.15",
+        "@jest/types": "^29.6.1",
+        "@jridgewell/trace-mapping": "^0.3.18",
         "babel-plugin-istanbul": "^6.1.1",
         "chalk": "^4.0.0",
         "convert-source-map": "^2.0.0",
         "fast-json-stable-stringify": "^2.1.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.5.0",
+        "jest-haste-map": "^29.6.1",
         "jest-regex-util": "^29.4.3",
-        "jest-util": "^29.5.0",
+        "jest-util": "^29.6.1",
         "micromatch": "^4.0.4",
         "pirates": "^4.0.4",
         "slash": "^3.0.0",
@@ -1305,12 +1300,12 @@
       }
     },
     "node_modules/@jest/types": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz",
-      "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz",
+      "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==",
       "dev": true,
       "dependencies": {
-        "@jest/schemas": "^29.4.3",
+        "@jest/schemas": "^29.6.0",
         "@types/istanbul-lib-coverage": "^2.0.0",
         "@types/istanbul-reports": "^3.0.0",
         "@types/node": "*",
@@ -1322,13 +1317,14 @@
       }
     },
     "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
-      "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
       "dev": true,
       "dependencies": {
-        "@jridgewell/set-array": "^1.0.0",
-        "@jridgewell/sourcemap-codec": "^1.4.10"
+        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.9"
       },
       "engines": {
         "node": ">=6.0.0"
@@ -1353,21 +1349,27 @@
       }
     },
     "node_modules/@jridgewell/sourcemap-codec": {
-      "version": "1.4.14",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+      "version": "1.4.15",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
       "dev": true
     },
     "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.17",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
-      "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+      "version": "0.3.18",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+      "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
       "dev": true,
       "dependencies": {
         "@jridgewell/resolve-uri": "3.1.0",
         "@jridgewell/sourcemap-codec": "1.4.14"
       }
     },
+    "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.14",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
+      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
+      "dev": true
+    },
     "node_modules/@kwsites/file-exists": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
@@ -1521,109 +1523,70 @@
       }
     },
     "node_modules/@octokit/graphql": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz",
-      "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz",
+      "integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==",
       "dependencies": {
-        "@octokit/request": "^6.0.0",
-        "@octokit/types": "^9.0.0",
+        "@octokit/request": "^8.0.1",
+        "@octokit/types": "^11.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/endpoint": {
-      "version": "7.0.5",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz",
-      "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz",
+      "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^11.0.0",
         "is-plain-object": "^5.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": {
-      "version": "16.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz",
-      "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA=="
+      "version": "18.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz",
+      "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw=="
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/request": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz",
-      "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz",
+      "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==",
       "dependencies": {
-        "@octokit/endpoint": "^7.0.0",
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^9.0.0",
+        "@octokit/endpoint": "^9.0.0",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^11.1.0",
         "is-plain-object": "^5.0.0",
-        "node-fetch": "^2.6.7",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/request-error": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
-      "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz",
+      "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^11.0.0",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/types": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz",
-      "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==",
-      "dependencies": {
-        "@octokit/openapi-types": "^16.0.0"
-      }
-    },
-    "node_modules/@octokit/graphql/node_modules/node-fetch": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
-      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@octokit/graphql/node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
-    "node_modules/@octokit/graphql/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-    },
-    "node_modules/@octokit/graphql/node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz",
+      "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==",
       "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
+        "@octokit/openapi-types": "^18.0.0"
       }
     },
     "node_modules/@octokit/openapi-types": {
@@ -1642,14 +1605,6 @@
         "@octokit/core": ">=2"
       }
     },
-    "node_modules/@octokit/plugin-request-log": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
-      "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
-      "peerDependencies": {
-        "@octokit/core": ">=3"
-      }
-    },
     "node_modules/@octokit/plugin-rest-endpoint-methods": {
       "version": "5.16.2",
       "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
@@ -1724,167 +1679,135 @@
       }
     },
     "node_modules/@octokit/rest": {
-      "version": "19.0.7",
-      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz",
-      "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==",
+      "version": "20.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz",
+      "integrity": "sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q==",
       "dependencies": {
-        "@octokit/core": "^4.1.0",
-        "@octokit/plugin-paginate-rest": "^6.0.0",
-        "@octokit/plugin-request-log": "^1.0.4",
-        "@octokit/plugin-rest-endpoint-methods": "^7.0.0"
+        "@octokit/core": "^5.0.0",
+        "@octokit/plugin-paginate-rest": "^8.0.0",
+        "@octokit/plugin-request-log": "^4.0.0",
+        "@octokit/plugin-rest-endpoint-methods": "^9.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/auth-token": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz",
-      "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==",
-      "dependencies": {
-        "@octokit/types": "^9.0.0"
-      },
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
+      "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/core": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz",
-      "integrity": "sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg==",
-      "dependencies": {
-        "@octokit/auth-token": "^3.0.0",
-        "@octokit/graphql": "^5.0.0",
-        "@octokit/request": "^6.0.0",
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^9.0.0",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.0.tgz",
+      "integrity": "sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==",
+      "dependencies": {
+        "@octokit/auth-token": "^4.0.0",
+        "@octokit/graphql": "^7.0.0",
+        "@octokit/request": "^8.0.2",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^11.0.0",
         "before-after-hook": "^2.2.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/endpoint": {
-      "version": "7.0.5",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz",
-      "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz",
+      "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^11.0.0",
         "is-plain-object": "^5.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": {
-      "version": "16.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-16.0.0.tgz",
-      "integrity": "sha512-JbFWOqTJVLHZSUUoF4FzAZKYtqdxWu9Z5m2QQnOyEa04fOFljvyh7D3GYKbfuaSWisqehImiVIMG4eyJeP5VEA=="
+      "version": "18.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz",
+      "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw=="
     },
     "node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.0.0.tgz",
-      "integrity": "sha512-Sq5VU1PfT6/JyuXPyt04KZNVsFOSBaYOAq2QRZUwzVlI10KFvcbUo8lR258AAQL1Et60b0WuVik+zOWKLuDZxw==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz",
+      "integrity": "sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==",
       "dependencies": {
-        "@octokit/types": "^9.0.0"
+        "@octokit/types": "^11.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       },
       "peerDependencies": {
-        "@octokit/core": ">=4"
+        "@octokit/core": ">=5"
+      }
+    },
+    "node_modules/@octokit/rest/node_modules/@octokit/plugin-request-log": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz",
+      "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==",
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=5"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.0.1.tgz",
-      "integrity": "sha512-pnCaLwZBudK5xCdrR823xHGNgqOzRnJ/mpC/76YPpNP7DybdsJtP7mdOwh+wYZxK5jqeQuhu59ogMI4NRlBUvA==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz",
+      "integrity": "sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
-        "deprecation": "^2.3.1"
+        "@octokit/types": "^11.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       },
       "peerDependencies": {
-        "@octokit/core": ">=3"
+        "@octokit/core": ">=5"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/request": {
-      "version": "6.2.3",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz",
-      "integrity": "sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz",
+      "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==",
       "dependencies": {
-        "@octokit/endpoint": "^7.0.0",
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^9.0.0",
+        "@octokit/endpoint": "^9.0.0",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^11.1.0",
         "is-plain-object": "^5.0.0",
-        "node-fetch": "^2.6.7",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/request-error": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
-      "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz",
+      "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^11.0.0",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/types": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.0.0.tgz",
-      "integrity": "sha512-LUewfj94xCMH2rbD5YJ+6AQ4AVjFYTgpp6rboWM5T7N3IsIF65SBEOVcYMGAEzO/kKNiNaW4LoWtoThOhH06gw==",
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz",
+      "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==",
       "dependencies": {
-        "@octokit/openapi-types": "^16.0.0"
-      }
-    },
-    "node_modules/@octokit/rest/node_modules/node-fetch": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
-      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@octokit/rest/node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
-    "node_modules/@octokit/rest/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-    },
-    "node_modules/@octokit/rest/node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
+        "@octokit/openapi-types": "^18.0.0"
       }
     },
     "node_modules/@octokit/types": {
@@ -1906,11 +1829,11 @@
       "integrity": "sha512-iHMRuu8YWDJIdqCi1krx0cyFNeqszNKTOb0dXFu2wQ5BeIqxqPJLD7rjZ2Vjf/+YaPSbWuIQE1H6TaGMMsDfdA=="
     },
     "node_modules/@primer/css": {
-      "version": "21.0.0",
-      "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.0.tgz",
-      "integrity": "sha512-bIiBv/qKUzYMoy9dDeAM2qOHBj/AX/1obG0Cbwcg2mCFBhfxIGl49AOyMx3EcYNDPO86ZHPFhF91gYUvlguKiQ==",
+      "version": "21.0.7",
+      "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.7.tgz",
+      "integrity": "sha512-Iq0VkpLVZqHZTo2JOIv+RPVu3bWj/BU/MIZrNZ4GRTJTY0YFQ/YCmUYKY1swgiCiPF/RKew5xIkf1cWaqtkQEA==",
       "dependencies": {
-        "@primer/primitives": "^7.11.3",
+        "@primer/primitives": "^7.11.12",
         "@primer/view-components": "^0.1.0"
       },
       "engines": {
@@ -1918,17 +1841,17 @@
       }
     },
     "node_modules/@primer/octicons": {
-      "version": "18.3.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-18.3.0.tgz",
-      "integrity": "sha512-vyUej5rKjXfqHAmYSo2k3pA9IsL5KJaYOBVXvc188FwBfUweA+WVP3qwWyZTSQnp9LK6yOajGyr0SCMIa9ombw==",
+      "version": "19.4.0",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.4.0.tgz",
+      "integrity": "sha512-92eXALm3ucZkzqpJmJbC+fR9ldiuNd4W4s2MZQNQIBahpg14emJ+I9fdHqCummFlfgyohLzXn++7rz0NlkqAJA==",
       "dependencies": {
         "object-assign": "^4.1.1"
       }
     },
     "node_modules/@primer/primitives": {
-      "version": "7.11.3",
-      "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.11.3.tgz",
-      "integrity": "sha512-od+rjE04X5sAtGncn9v7/ehZS2O9/tBpQpRsNirU5d4EuOwWMXTt3c6zMBkke136jbmJ0VbGhU+DrLwhj0AM9w=="
+      "version": "7.11.14",
+      "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.11.14.tgz",
+      "integrity": "sha512-z/yUTEkbGhvFqoJ8rpLz3pHJfLNRdoyNd/xNdAl/LKqA97Z60tsSVJMfxNMXi3aS9dCIC1dexK5/Gp4y9JrRkg=="
     },
     "node_modules/@primer/view-components": {
       "version": "0.1.4",
@@ -1949,16 +1872,15 @@
       }
     },
     "node_modules/@puppeteer/browsers": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-0.3.1.tgz",
-      "integrity": "sha512-WTFVqWY7ipI+CsJRb6vEddYJ/lMl2bHYP5BjFDBM9JMKPjJNT4psXz6DLuJpi3EkG80Q0ef5Azzv3gKu9MvMUg==",
+      "version": "1.4.6",
+      "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz",
+      "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==",
       "dependencies": {
         "debug": "4.3.4",
         "extract-zip": "2.0.1",
-        "https-proxy-agent": "5.0.1",
         "progress": "2.0.3",
-        "proxy-from-env": "1.1.0",
-        "tar-fs": "2.1.1",
+        "proxy-agent": "6.3.0",
+        "tar-fs": "3.0.4",
         "unbzip2-stream": "1.4.3",
         "yargs": "17.7.1"
       },
@@ -1966,7 +1888,7 @@
         "browsers": "lib/cjs/main-cli.js"
       },
       "engines": {
-        "node": ">=14.1.0"
+        "node": ">=16.3.0"
       },
       "peerDependencies": {
         "typescript": ">= 4.7.4"
@@ -1977,50 +1899,48 @@
         }
       }
     },
-    "node_modules/@sinclair/typebox": {
-      "version": "0.25.24",
-      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
-      "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
-      "dev": true
+    "node_modules/@puppeteer/browsers/node_modules/tar-fs": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
+      "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
+      "dependencies": {
+        "mkdirp-classic": "^0.5.2",
+        "pump": "^3.0.0",
+        "tar-stream": "^3.1.5"
+      }
     },
-    "node_modules/@sindresorhus/is": {
-      "version": "5.3.0",
-      "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz",
-      "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==",
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/is?sponsor=1"
+    "node_modules/@puppeteer/browsers/node_modules/tar-stream": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
+      "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
+      "dependencies": {
+        "b4a": "^1.6.4",
+        "fast-fifo": "^1.2.0",
+        "streamx": "^2.15.0"
       }
     },
+    "node_modules/@sinclair/typebox": {
+      "version": "0.27.8",
+      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+      "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+      "dev": true
+    },
     "node_modules/@sinonjs/commons": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
-      "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
+      "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
       "dev": true,
       "dependencies": {
         "type-detect": "4.0.8"
       }
     },
     "node_modules/@sinonjs/fake-timers": {
-      "version": "10.0.2",
-      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz",
-      "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==",
+      "version": "10.3.0",
+      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+      "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
       "dev": true,
       "dependencies": {
-        "@sinonjs/commons": "^2.0.0"
-      }
-    },
-    "node_modules/@szmarczak/http-timer": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
-      "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
-      "dependencies": {
-        "defer-to-connect": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=14.16"
+        "@sinonjs/commons": "^3.0.0"
       }
     },
     "node_modules/@tokenizer/token": {
@@ -2036,6 +1956,11 @@
         "node": ">= 10"
       }
     },
+    "node_modules/@tootallnate/quickjs-emscripten": {
+      "version": "0.23.0",
+      "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+      "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="
+    },
     "node_modules/@trysound/sax": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
@@ -2050,9 +1975,9 @@
       "integrity": "sha512-psQR5WEZjqSFy1gxJKpiMR9ygy59jykqIAAON8Xir78t9+E4z6S/BwYsksbylzJB1nCHKLzvkROrUHk2DKnEbg=="
     },
     "node_modules/@types/babel__core": {
-      "version": "7.20.0",
-      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz",
-      "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==",
+      "version": "7.20.1",
+      "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz",
+      "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==",
       "dev": true,
       "dependencies": {
         "@babel/parser": "^7.20.7",
@@ -2082,12 +2007,12 @@
       }
     },
     "node_modules/@types/babel__traverse": {
-      "version": "7.18.3",
-      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
-      "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
+      "version": "7.20.1",
+      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz",
+      "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.3.0"
+        "@babel/types": "^7.20.7"
       }
     },
     "node_modules/@types/graceful-fs": {
@@ -2099,11 +2024,6 @@
         "@types/node": "*"
       }
     },
-    "node_modules/@types/http-cache-semantics": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
-      "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
-    },
     "node_modules/@types/istanbul-lib-coverage": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
@@ -2135,9 +2055,9 @@
       "devOptional": true
     },
     "node_modules/@types/prettier": {
-      "version": "2.7.2",
-      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz",
-      "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==",
+      "version": "2.7.3",
+      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
+      "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
       "dev": true
     },
     "node_modules/@types/stack-utils": {
@@ -2147,9 +2067,9 @@
       "dev": true
     },
     "node_modules/@types/yargs": {
-      "version": "17.0.22",
-      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.22.tgz",
-      "integrity": "sha512-pet5WJ9U8yPVRhkwuEIp5ktAeAqRZOq4UdAyWLWzxbtpyXnzbtLdKiXAjJzi/KLmPGS9wk86lUFWZFN6sISo4g==",
+      "version": "17.0.24",
+      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz",
+      "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==",
       "dev": true,
       "dependencies": {
         "@types/yargs-parser": "*"
@@ -2204,9 +2124,10 @@
       }
     },
     "node_modules/acorn": {
-      "version": "8.8.2",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz",
-      "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==",
+      "version": "8.10.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+      "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+      "dev": true,
       "bin": {
         "acorn": "bin/acorn"
       },
@@ -2214,15 +2135,6 @@
         "node": ">=0.4.0"
       }
     },
-    "node_modules/acorn-globals": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
-      "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
-      "dependencies": {
-        "acorn": "^8.1.0",
-        "acorn-walk": "^8.0.2"
-      }
-    },
     "node_modules/acorn-jsx": {
       "version": "5.3.2",
       "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
@@ -2232,14 +2144,6 @@
         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
       }
     },
-    "node_modules/acorn-walk": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
-      "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
     "node_modules/agent-base": {
       "version": "6.0.2",
       "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -2372,6 +2276,17 @@
       "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
       "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
     },
+    "node_modules/ast-types": {
+      "version": "0.13.4",
+      "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+      "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+      "dependencies": {
+        "tslib": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/async": {
       "version": "3.2.4",
       "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
@@ -2383,22 +2298,27 @@
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "node_modules/axios": {
-      "version": "1.3.4",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz",
-      "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
+      "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
       "dependencies": {
         "follow-redirects": "^1.15.0",
         "form-data": "^4.0.0",
         "proxy-from-env": "^1.1.0"
       }
     },
+    "node_modules/b4a": {
+      "version": "1.6.4",
+      "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz",
+      "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw=="
+    },
     "node_modules/babel-jest": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz",
-      "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz",
+      "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==",
       "dev": true,
       "dependencies": {
-        "@jest/transform": "^29.5.0",
+        "@jest/transform": "^29.6.1",
         "@types/babel__core": "^7.1.14",
         "babel-plugin-istanbul": "^6.1.1",
         "babel-preset-jest": "^29.5.0",
@@ -2507,6 +2427,14 @@
         }
       ]
     },
+    "node_modules/basic-ftp": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz",
+      "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
     "node_modules/before-after-hook": {
       "version": "2.2.3",
       "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
@@ -2620,9 +2548,9 @@
       }
     },
     "node_modules/browserslist": {
-      "version": "4.21.5",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz",
-      "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==",
+      "version": "4.21.9",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz",
+      "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
       "dev": true,
       "funding": [
         {
@@ -2632,13 +2560,17 @@
         {
           "type": "tidelift",
           "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
         }
       ],
       "dependencies": {
-        "caniuse-lite": "^1.0.30001449",
-        "electron-to-chromium": "^1.4.284",
-        "node-releases": "^2.0.8",
-        "update-browserslist-db": "^1.0.10"
+        "caniuse-lite": "^1.0.30001503",
+        "electron-to-chromium": "^1.4.431",
+        "node-releases": "^2.0.12",
+        "update-browserslist-db": "^1.0.11"
       },
       "bin": {
         "browserslist": "cli.js"
@@ -2693,6 +2625,17 @@
       "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
       "dev": true
     },
+    "node_modules/busboy": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
+      "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
+      "dependencies": {
+        "streamsearch": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=10.16.0"
+      }
+    },
     "node_modules/bytes": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
@@ -2701,31 +2644,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/cacheable-lookup": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
-      "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
-      "engines": {
-        "node": ">=14.16"
-      }
-    },
-    "node_modules/cacheable-request": {
-      "version": "10.2.8",
-      "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.8.tgz",
-      "integrity": "sha512-IDVO5MJ4LItE6HKFQTqT2ocAQsisOoCTUDu1ddCmnhyiwFQjXNPp4081Xj23N4tO+AFEFNzGuNEf/c8Gwwt15A==",
-      "dependencies": {
-        "@types/http-cache-semantics": "^4.0.1",
-        "get-stream": "^6.0.1",
-        "http-cache-semantics": "^4.1.1",
-        "keyv": "^4.5.2",
-        "mimic-response": "^4.0.0",
-        "normalize-url": "^8.0.0",
-        "responselike": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=14.16"
-      }
-    },
     "node_modules/call-bind": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
@@ -2756,9 +2674,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001464",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001464.tgz",
-      "integrity": "sha512-oww27MtUmusatpRpCGSOneQk2/l5czXANDSFvsc7VuOQ86s3ANhZetpwXNf1zY/zdfP63Xvjz325DAdAoES13g==",
+      "version": "1.0.30001517",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz",
+      "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==",
       "dev": true,
       "funding": [
         {
@@ -2768,6 +2686,10 @@
         {
           "type": "tidelift",
           "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
         }
       ]
     },
@@ -2811,9 +2733,9 @@
       }
     },
     "node_modules/chardet": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.5.1.tgz",
-      "integrity": "sha512-0XMOtA52igKDOIfvJZJ6v0+J9yMF3IuYyEa5oFUxBXA01G6mwCNKpul3bgbFf7lmZuqwN/oyg/zQ1cGS7NyJkQ=="
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-1.6.0.tgz",
+      "integrity": "sha512-+QOTw3otC4+FxdjK9RopGpNOglADbr4WPFi0SonkO99JbpkTPbMxmdm4NenhF5Zs+4gPXLI1+y2uazws5TMe8w=="
     },
     "node_modules/cheerio": {
       "version": "1.0.0-rc.12",
@@ -2852,9 +2774,9 @@
       }
     },
     "node_modules/chess.js": {
-      "version": "1.0.0-beta.3",
-      "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.0.0-beta.3.tgz",
-      "integrity": "sha512-zu8QVvP0BmMzrstlsrXL2LxdHfAkrtyNftVRaJXGI5mn2ZSsgTJujvZx5BVJsPMwBkRZ+omCdZkVyVLBlKn2HA==",
+      "version": "1.0.0-beta.6",
+      "resolved": "https://registry.npmjs.org/chess.js/-/chess.js-1.0.0-beta.6.tgz",
+      "integrity": "sha512-sqBfX1VL3csSyqVM5ogbKA+aRlZyWDh276ruWXphwI0lDUMs7iYjZs29BOi49f7mXeunJE7cdfnIZhihsyLnsA==",
       "optional": true
     },
     "node_modules/chownr": {
@@ -2867,9 +2789,9 @@
       }
     },
     "node_modules/chromium-bidi": {
-      "version": "0.4.6",
-      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.6.tgz",
-      "integrity": "sha512-TQOkWRaLI/IWvoP8XC+7jO4uHTIiAUiklXU1T0qszlUFEai9LgKXIBXy3pOS3EnQZ3bQtMbKUPkug0fTAEHCSw==",
+      "version": "0.4.16",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz",
+      "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==",
       "dependencies": {
         "mitt": "3.0.0"
       },
@@ -2893,9 +2815,9 @@
       }
     },
     "node_modules/cjs-module-lexer": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
-      "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
+      "version": "1.2.3",
+      "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
+      "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
       "dev": true
     },
     "node_modules/clipboard": {
@@ -2940,9 +2862,9 @@
       }
     },
     "node_modules/collect-v8-coverage": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
-      "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==",
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+      "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
       "dev": true
     },
     "node_modules/color": {
@@ -3125,9 +3047,9 @@
       "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
     },
     "node_modules/cosmiconfig": {
-      "version": "8.1.3",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz",
-      "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==",
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz",
+      "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==",
       "dependencies": {
         "import-fresh": "^3.2.1",
         "js-yaml": "^4.1.0",
@@ -3142,17 +3064,17 @@
       }
     },
     "node_modules/cross-fetch": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
-      "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
+      "version": "3.1.8",
+      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz",
+      "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==",
       "dependencies": {
-        "node-fetch": "2.6.7"
+        "node-fetch": "^2.6.12"
       }
     },
     "node_modules/cross-fetch/node_modules/node-fetch": {
-      "version": "2.6.7",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
-      "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+      "version": "2.6.12",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
+      "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
       "dependencies": {
         "whatwg-url": "^5.0.0"
       },
@@ -3286,9 +3208,9 @@
       "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
     },
     "node_modules/d3": {
-      "version": "7.8.3",
-      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.3.tgz",
-      "integrity": "sha512-cAa866AkPXtt4IzRx6nzGf50uerq6VYks7p/tTH94be4QfhUkyTfJfaxXGPOB5ZRVUZmUV1wcM1dism/Ua0lCw==",
+      "version": "7.8.5",
+      "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz",
+      "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==",
       "dependencies": {
         "d3-array": "3",
         "d3-axis": "3",
@@ -3748,7 +3670,8 @@
     "node_modules/deep-is": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
-      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+      "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+      "dev": true
     },
     "node_modules/deepmerge": {
       "version": "4.3.0",
@@ -3758,12 +3681,17 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/defer-to-connect": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
-      "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+    "node_modules/degenerator": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
+      "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
+      "dependencies": {
+        "ast-types": "^0.13.4",
+        "escodegen": "^2.1.0",
+        "esprima": "^4.0.1"
+      },
       "engines": {
-        "node": ">=10"
+        "node": ">= 14"
       }
     },
     "node_modules/delaunator": {
@@ -3816,9 +3744,9 @@
       }
     },
     "node_modules/detect-libc": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
-      "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
+      "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
       "engines": {
         "node": ">=8"
       }
@@ -3833,9 +3761,9 @@
       }
     },
     "node_modules/devtools-protocol": {
-      "version": "0.0.1107588",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1107588.tgz",
-      "integrity": "sha512-yIR+pG9x65Xko7bErCUSQaDLrO/P1p3JUzEk7JCU4DowPcGHkTGUGQapcfcLc4qj0UaALwZ+cr0riFgiqpixcg=="
+      "version": "0.0.1147663",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz",
+      "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ=="
     },
     "node_modules/diff-sequences": {
       "version": "29.4.3",
@@ -3954,9 +3882,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.328",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.328.tgz",
-      "integrity": "sha512-DE9tTy2PNmy1v55AZAO542ui+MLC2cvINMK4P2LXGsJdput/ThVG9t+QGecPuAZZSgC8XoI+Jh9M1OG9IoNSCw==",
+      "version": "1.4.468",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz",
+      "integrity": "sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag==",
       "dev": true
     },
     "node_modules/emittery": {
@@ -4051,14 +3979,13 @@
       }
     },
     "node_modules/escodegen": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz",
-      "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==",
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+      "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
       "dependencies": {
         "esprima": "^4.0.1",
         "estraverse": "^5.2.0",
-        "esutils": "^2.0.2",
-        "optionator": "^0.8.1"
+        "esutils": "^2.0.2"
       },
       "bin": {
         "escodegen": "bin/escodegen.js",
@@ -4071,64 +3998,17 @@
         "source-map": "~0.6.1"
       }
     },
-    "node_modules/escodegen/node_modules/levn": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
-      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
-      "dependencies": {
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/optionator": {
-      "version": "0.8.3",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
-      "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
-      "dependencies": {
-        "deep-is": "~0.1.3",
-        "fast-levenshtein": "~2.0.6",
-        "levn": "~0.3.0",
-        "prelude-ls": "~1.1.2",
-        "type-check": "~0.3.2",
-        "word-wrap": "~1.2.3"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/prelude-ls": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
-      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
-    "node_modules/escodegen/node_modules/type-check": {
-      "version": "0.3.2",
-      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
-      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
-      "dependencies": {
-        "prelude-ls": "~1.1.2"
-      },
-      "engines": {
-        "node": ">= 0.8.0"
-      }
-    },
     "node_modules/eslint": {
-      "version": "8.38.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz",
-      "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==",
+      "version": "8.45.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
+      "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.4.0",
-        "@eslint/eslintrc": "^2.0.2",
-        "@eslint/js": "8.38.0",
-        "@humanwhocodes/config-array": "^0.11.8",
+        "@eslint/eslintrc": "^2.1.0",
+        "@eslint/js": "8.44.0",
+        "@humanwhocodes/config-array": "^0.11.10",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
         "ajv": "^6.10.0",
@@ -4137,9 +4017,9 @@
         "debug": "^4.3.2",
         "doctrine": "^3.0.0",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.1.1",
-        "eslint-visitor-keys": "^3.4.0",
-        "espree": "^9.5.1",
+        "eslint-scope": "^7.2.0",
+        "eslint-visitor-keys": "^3.4.1",
+        "espree": "^9.6.0",
         "esquery": "^1.4.2",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -4147,22 +4027,19 @@
         "find-up": "^5.0.0",
         "glob-parent": "^6.0.2",
         "globals": "^13.19.0",
-        "grapheme-splitter": "^1.0.4",
+        "graphemer": "^1.4.0",
         "ignore": "^5.2.0",
-        "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
         "is-glob": "^4.0.0",
         "is-path-inside": "^3.0.3",
-        "js-sdsl": "^4.1.4",
         "js-yaml": "^4.1.0",
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "levn": "^0.4.1",
         "lodash.merge": "^4.6.2",
         "minimatch": "^3.1.2",
         "natural-compare": "^1.4.0",
-        "optionator": "^0.9.1",
+        "optionator": "^0.9.3",
         "strip-ansi": "^6.0.1",
-        "strip-json-comments": "^3.1.0",
         "text-table": "^0.2.0"
       },
       "bin": {
@@ -4176,9 +4053,9 @@
       }
     },
     "node_modules/eslint-scope": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
-      "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+      "version": "7.2.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz",
+      "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==",
       "dev": true,
       "dependencies": {
         "esrecurse": "^4.3.0",
@@ -4186,12 +4063,15 @@
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+      },
+      "funding": {
+        "url": "https://opencollective.com/eslint"
       }
     },
     "node_modules/eslint-visitor-keys": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz",
-      "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
+      "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -4223,14 +4103,14 @@
       }
     },
     "node_modules/espree": {
-      "version": "9.5.1",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz",
-      "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==",
+      "version": "9.6.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+      "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
       "dev": true,
       "dependencies": {
-        "acorn": "^8.8.0",
+        "acorn": "^8.9.0",
         "acorn-jsx": "^5.3.2",
-        "eslint-visitor-keys": "^3.4.0"
+        "eslint-visitor-keys": "^3.4.1"
       },
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -4340,16 +4220,17 @@
       }
     },
     "node_modules/expect": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz",
-      "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz",
+      "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==",
       "dev": true,
       "dependencies": {
-        "@jest/expect-utils": "^29.5.0",
+        "@jest/expect-utils": "^29.6.1",
+        "@types/node": "*",
         "jest-get-type": "^29.4.3",
-        "jest-matcher-utils": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-util": "^29.5.0"
+        "jest-matcher-utils": "^29.6.1",
+        "jest-message-util": "^29.6.1",
+        "jest-util": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -4397,11 +4278,11 @@
       }
     },
     "node_modules/express-rate-limit": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.7.0.tgz",
-      "integrity": "sha512-vhwIdRoqcYB/72TK3tRZI+0ttS8Ytrk24GfmsxDXK9o9IhHNO5bXRiXQSExPQ4GbaE5tvIS7j1SGrxsuWs+sGA==",
+      "version": "6.8.0",
+      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.8.0.tgz",
+      "integrity": "sha512-yVeDWczkh8qgo9INJB1tT4j7LFu+n6ei/oqSMsqpsUIGYjTM+gk+Q3wv19TMUdo8chvus8XohAuOhG7RYRM9ZQ==",
       "engines": {
-        "node": ">= 12.9.0"
+        "node": ">= 14.0.0"
       },
       "peerDependencies": {
         "express": "^4 || ^5"
@@ -4478,6 +4359,11 @@
       "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
       "dev": true
     },
+    "node_modules/fast-fifo": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz",
+      "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw=="
+    },
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -4487,7 +4373,8 @@
     "node_modules/fast-levenshtein": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+      "dev": true
     },
     "node_modules/fastq": {
       "version": "1.15.0",
@@ -4550,9 +4437,9 @@
       }
     },
     "node_modules/file-type": {
-      "version": "18.2.1",
-      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz",
-      "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==",
+      "version": "18.5.0",
+      "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.5.0.tgz",
+      "integrity": "sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ==",
       "dependencies": {
         "readable-web-to-node-stream": "^3.0.2",
         "strtok3": "^7.0.0",
@@ -4708,14 +4595,6 @@
         "node": ">= 6"
       }
     },
-    "node_modules/form-data-encoder": {
-      "version": "2.1.4",
-      "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
-      "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
-      "engines": {
-        "node": ">= 14.17"
-      }
-    },
     "node_modules/formdata-polyfill": {
       "version": "4.0.10",
       "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
@@ -4748,6 +4627,27 @@
       "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
       "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
     },
+    "node_modules/fs-extra": {
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+      "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+      "dependencies": {
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^4.0.0",
+        "universalify": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=6 <7 || >=8"
+      }
+    },
+    "node_modules/fs-extra/node_modules/universalify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
     "node_modules/fs-minipass": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
@@ -4865,6 +4765,7 @@
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
       "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+      "dev": true,
       "engines": {
         "node": ">=10"
       },
@@ -4872,6 +4773,28 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/get-uri": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz",
+      "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==",
+      "dependencies": {
+        "basic-ftp": "^5.0.2",
+        "data-uri-to-buffer": "^5.0.1",
+        "debug": "^4.3.4",
+        "fs-extra": "^8.1.0"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/get-uri/node_modules/data-uri-to-buffer": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz",
+      "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==",
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/gifencoder": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz",
@@ -4963,40 +4886,15 @@
         "delegate": "^3.1.2"
       }
     },
-    "node_modules/got": {
-      "version": "12.6.0",
-      "resolved": "https://registry.npmjs.org/got/-/got-12.6.0.tgz",
-      "integrity": "sha512-WTcaQ963xV97MN3x0/CbAriXFZcXCfgxVp91I+Ze6pawQOa7SgzwSx2zIJJsX+kTajMnVs0xcFD1TxZKFqhdnQ==",
-      "dependencies": {
-        "@sindresorhus/is": "^5.2.0",
-        "@szmarczak/http-timer": "^5.0.1",
-        "cacheable-lookup": "^7.0.0",
-        "cacheable-request": "^10.2.8",
-        "decompress-response": "^6.0.0",
-        "form-data-encoder": "^2.1.2",
-        "get-stream": "^6.0.1",
-        "http2-wrapper": "^2.1.10",
-        "lowercase-keys": "^3.0.0",
-        "p-cancelable": "^3.0.0",
-        "responselike": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/got?sponsor=1"
-      }
-    },
     "node_modules/graceful-fs": {
       "version": "4.2.10",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
-      "dev": true
+      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
     },
-    "node_modules/grapheme-splitter": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
-      "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+    "node_modules/graphemer": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+      "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
       "dev": true
     },
     "node_modules/has": {
@@ -5070,11 +4968,6 @@
         "entities": "^4.3.0"
       }
     },
-    "node_modules/http-cache-semantics": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
-      "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
-    },
     "node_modules/http-errors": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -5103,18 +4996,6 @@
         "node": ">= 6"
       }
     },
-    "node_modules/http2-wrapper": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
-      "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==",
-      "dependencies": {
-        "quick-lru": "^5.1.1",
-        "resolve-alpn": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=10.19.0"
-      }
-    },
     "node_modules/https-proxy-agent": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -5253,6 +5134,11 @@
         "node": ">=12"
       }
     },
+    "node_modules/ip": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
+      "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg=="
+    },
     "node_modules/ipaddr.js": {
       "version": "1.9.1",
       "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@@ -5267,9 +5153,9 @@
       "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
     },
     "node_modules/is-core-module": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
-      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
+      "version": "2.12.1",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
+      "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
       "dev": true,
       "dependencies": {
         "has": "^1.0.3"
@@ -5402,9 +5288,9 @@
       }
     },
     "node_modules/istanbul-lib-instrument/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "dev": true,
       "bin": {
         "semver": "bin/semver.js"
@@ -5494,15 +5380,15 @@
       }
     },
     "node_modules/jest": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
-      "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz",
+      "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.5.0",
-        "@jest/types": "^29.5.0",
+        "@jest/core": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "import-local": "^3.0.2",
-        "jest-cli": "^29.5.0"
+        "jest-cli": "^29.6.1"
       },
       "bin": {
         "jest": "bin/jest.js"
@@ -5533,28 +5419,28 @@
       }
     },
     "node_modules/jest-circus": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz",
-      "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz",
+      "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.5.0",
-        "@jest/expect": "^29.5.0",
-        "@jest/test-result": "^29.5.0",
-        "@jest/types": "^29.5.0",
+        "@jest/environment": "^29.6.1",
+        "@jest/expect": "^29.6.1",
+        "@jest/test-result": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "co": "^4.6.0",
         "dedent": "^0.7.0",
         "is-generator-fn": "^2.0.0",
-        "jest-each": "^29.5.0",
-        "jest-matcher-utils": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-runtime": "^29.5.0",
-        "jest-snapshot": "^29.5.0",
-        "jest-util": "^29.5.0",
+        "jest-each": "^29.6.1",
+        "jest-matcher-utils": "^29.6.1",
+        "jest-message-util": "^29.6.1",
+        "jest-runtime": "^29.6.1",
+        "jest-snapshot": "^29.6.1",
+        "jest-util": "^29.6.1",
         "p-limit": "^3.1.0",
-        "pretty-format": "^29.5.0",
+        "pretty-format": "^29.6.1",
         "pure-rand": "^6.0.0",
         "slash": "^3.0.0",
         "stack-utils": "^2.0.3"
@@ -5564,21 +5450,21 @@
       }
     },
     "node_modules/jest-cli": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz",
-      "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz",
+      "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.5.0",
-        "@jest/test-result": "^29.5.0",
-        "@jest/types": "^29.5.0",
+        "@jest/core": "^29.6.1",
+        "@jest/test-result": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "chalk": "^4.0.0",
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
         "import-local": "^3.0.2",
-        "jest-config": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "jest-validate": "^29.5.0",
+        "jest-config": "^29.6.1",
+        "jest-util": "^29.6.1",
+        "jest-validate": "^29.6.1",
         "prompts": "^2.0.1",
         "yargs": "^17.3.1"
       },
@@ -5598,31 +5484,31 @@
       }
     },
     "node_modules/jest-config": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz",
-      "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz",
+      "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
-        "@jest/test-sequencer": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "babel-jest": "^29.5.0",
+        "@jest/test-sequencer": "^29.6.1",
+        "@jest/types": "^29.6.1",
+        "babel-jest": "^29.6.1",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
         "deepmerge": "^4.2.2",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-circus": "^29.5.0",
-        "jest-environment-node": "^29.5.0",
+        "jest-circus": "^29.6.1",
+        "jest-environment-node": "^29.6.1",
         "jest-get-type": "^29.4.3",
         "jest-regex-util": "^29.4.3",
-        "jest-resolve": "^29.5.0",
-        "jest-runner": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "jest-validate": "^29.5.0",
+        "jest-resolve": "^29.6.1",
+        "jest-runner": "^29.6.1",
+        "jest-util": "^29.6.1",
+        "jest-validate": "^29.6.1",
         "micromatch": "^4.0.4",
         "parse-json": "^5.2.0",
-        "pretty-format": "^29.5.0",
+        "pretty-format": "^29.6.1",
         "slash": "^3.0.0",
         "strip-json-comments": "^3.1.1"
       },
@@ -5643,15 +5529,15 @@
       }
     },
     "node_modules/jest-diff": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
-      "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz",
+      "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
         "diff-sequences": "^29.4.3",
         "jest-get-type": "^29.4.3",
-        "pretty-format": "^29.5.0"
+        "pretty-format": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -5670,33 +5556,33 @@
       }
     },
     "node_modules/jest-each": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz",
-      "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz",
+      "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.5.0",
+        "@jest/types": "^29.6.1",
         "chalk": "^4.0.0",
         "jest-get-type": "^29.4.3",
-        "jest-util": "^29.5.0",
-        "pretty-format": "^29.5.0"
+        "jest-util": "^29.6.1",
+        "pretty-format": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-environment-node": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz",
-      "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz",
+      "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.5.0",
-        "@jest/fake-timers": "^29.5.0",
-        "@jest/types": "^29.5.0",
+        "@jest/environment": "^29.6.1",
+        "@jest/fake-timers": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "@types/node": "*",
-        "jest-mock": "^29.5.0",
-        "jest-util": "^29.5.0"
+        "jest-mock": "^29.6.1",
+        "jest-util": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -5712,20 +5598,20 @@
       }
     },
     "node_modules/jest-haste-map": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz",
-      "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz",
+      "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.5.0",
+        "@jest/types": "^29.6.1",
         "@types/graceful-fs": "^4.1.3",
         "@types/node": "*",
         "anymatch": "^3.0.3",
         "fb-watchman": "^2.0.0",
         "graceful-fs": "^4.2.9",
         "jest-regex-util": "^29.4.3",
-        "jest-util": "^29.5.0",
-        "jest-worker": "^29.5.0",
+        "jest-util": "^29.6.1",
+        "jest-worker": "^29.6.1",
         "micromatch": "^4.0.4",
         "walker": "^1.0.8"
       },
@@ -5737,46 +5623,46 @@
       }
     },
     "node_modules/jest-leak-detector": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz",
-      "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz",
+      "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==",
       "dev": true,
       "dependencies": {
         "jest-get-type": "^29.4.3",
-        "pretty-format": "^29.5.0"
+        "pretty-format": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-matcher-utils": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz",
-      "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz",
+      "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
-        "jest-diff": "^29.5.0",
+        "jest-diff": "^29.6.1",
         "jest-get-type": "^29.4.3",
-        "pretty-format": "^29.5.0"
+        "pretty-format": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-message-util": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz",
-      "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz",
+      "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==",
       "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.12.13",
-        "@jest/types": "^29.5.0",
+        "@jest/types": "^29.6.1",
         "@types/stack-utils": "^2.0.0",
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
         "micromatch": "^4.0.4",
-        "pretty-format": "^29.5.0",
+        "pretty-format": "^29.6.1",
         "slash": "^3.0.0",
         "stack-utils": "^2.0.3"
       },
@@ -5785,14 +5671,14 @@
       }
     },
     "node_modules/jest-mock": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz",
-      "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz",
+      "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.5.0",
+        "@jest/types": "^29.6.1",
         "@types/node": "*",
-        "jest-util": "^29.5.0"
+        "jest-util": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -5825,17 +5711,17 @@
       }
     },
     "node_modules/jest-resolve": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz",
-      "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz",
+      "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.5.0",
+        "jest-haste-map": "^29.6.1",
         "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^29.5.0",
-        "jest-validate": "^29.5.0",
+        "jest-util": "^29.6.1",
+        "jest-validate": "^29.6.1",
         "resolve": "^1.20.0",
         "resolve.exports": "^2.0.0",
         "slash": "^3.0.0"
@@ -5845,43 +5731,43 @@
       }
     },
     "node_modules/jest-resolve-dependencies": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz",
-      "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz",
+      "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==",
       "dev": true,
       "dependencies": {
         "jest-regex-util": "^29.4.3",
-        "jest-snapshot": "^29.5.0"
+        "jest-snapshot": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-runner": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz",
-      "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz",
+      "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.5.0",
-        "@jest/environment": "^29.5.0",
-        "@jest/test-result": "^29.5.0",
-        "@jest/transform": "^29.5.0",
-        "@jest/types": "^29.5.0",
+        "@jest/console": "^29.6.1",
+        "@jest/environment": "^29.6.1",
+        "@jest/test-result": "^29.6.1",
+        "@jest/transform": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
         "graceful-fs": "^4.2.9",
         "jest-docblock": "^29.4.3",
-        "jest-environment-node": "^29.5.0",
-        "jest-haste-map": "^29.5.0",
-        "jest-leak-detector": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-resolve": "^29.5.0",
-        "jest-runtime": "^29.5.0",
-        "jest-util": "^29.5.0",
-        "jest-watcher": "^29.5.0",
-        "jest-worker": "^29.5.0",
+        "jest-environment-node": "^29.6.1",
+        "jest-haste-map": "^29.6.1",
+        "jest-leak-detector": "^29.6.1",
+        "jest-message-util": "^29.6.1",
+        "jest-resolve": "^29.6.1",
+        "jest-runtime": "^29.6.1",
+        "jest-util": "^29.6.1",
+        "jest-watcher": "^29.6.1",
+        "jest-worker": "^29.6.1",
         "p-limit": "^3.1.0",
         "source-map-support": "0.5.13"
       },
@@ -5890,31 +5776,31 @@
       }
     },
     "node_modules/jest-runtime": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz",
-      "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^29.5.0",
-        "@jest/fake-timers": "^29.5.0",
-        "@jest/globals": "^29.5.0",
-        "@jest/source-map": "^29.4.3",
-        "@jest/test-result": "^29.5.0",
-        "@jest/transform": "^29.5.0",
-        "@jest/types": "^29.5.0",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz",
+      "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==",
+      "dev": true,
+      "dependencies": {
+        "@jest/environment": "^29.6.1",
+        "@jest/fake-timers": "^29.6.1",
+        "@jest/globals": "^29.6.1",
+        "@jest/source-map": "^29.6.0",
+        "@jest/test-result": "^29.6.1",
+        "@jest/transform": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "cjs-module-lexer": "^1.0.0",
         "collect-v8-coverage": "^1.0.0",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-mock": "^29.5.0",
+        "jest-haste-map": "^29.6.1",
+        "jest-message-util": "^29.6.1",
+        "jest-mock": "^29.6.1",
         "jest-regex-util": "^29.4.3",
-        "jest-resolve": "^29.5.0",
-        "jest-snapshot": "^29.5.0",
-        "jest-util": "^29.5.0",
+        "jest-resolve": "^29.6.1",
+        "jest-snapshot": "^29.6.1",
+        "jest-util": "^29.6.1",
         "slash": "^3.0.0",
         "strip-bom": "^4.0.0"
       },
@@ -5923,46 +5809,44 @@
       }
     },
     "node_modules/jest-snapshot": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz",
-      "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz",
+      "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
         "@babel/generator": "^7.7.2",
         "@babel/plugin-syntax-jsx": "^7.7.2",
         "@babel/plugin-syntax-typescript": "^7.7.2",
-        "@babel/traverse": "^7.7.2",
         "@babel/types": "^7.3.3",
-        "@jest/expect-utils": "^29.5.0",
-        "@jest/transform": "^29.5.0",
-        "@jest/types": "^29.5.0",
-        "@types/babel__traverse": "^7.0.6",
+        "@jest/expect-utils": "^29.6.1",
+        "@jest/transform": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "@types/prettier": "^2.1.5",
         "babel-preset-current-node-syntax": "^1.0.0",
         "chalk": "^4.0.0",
-        "expect": "^29.5.0",
+        "expect": "^29.6.1",
         "graceful-fs": "^4.2.9",
-        "jest-diff": "^29.5.0",
+        "jest-diff": "^29.6.1",
         "jest-get-type": "^29.4.3",
-        "jest-matcher-utils": "^29.5.0",
-        "jest-message-util": "^29.5.0",
-        "jest-util": "^29.5.0",
+        "jest-matcher-utils": "^29.6.1",
+        "jest-message-util": "^29.6.1",
+        "jest-util": "^29.6.1",
         "natural-compare": "^1.4.0",
-        "pretty-format": "^29.5.0",
-        "semver": "^7.3.5"
+        "pretty-format": "^29.6.1",
+        "semver": "^7.5.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-util": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
-      "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz",
+      "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.5.0",
+        "@jest/types": "^29.6.1",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
@@ -5974,17 +5858,17 @@
       }
     },
     "node_modules/jest-validate": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz",
-      "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz",
+      "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.5.0",
+        "@jest/types": "^29.6.1",
         "camelcase": "^6.2.0",
         "chalk": "^4.0.0",
         "jest-get-type": "^29.4.3",
         "leven": "^3.1.0",
-        "pretty-format": "^29.5.0"
+        "pretty-format": "^29.6.1"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -6003,18 +5887,18 @@
       }
     },
     "node_modules/jest-watcher": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz",
-      "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz",
+      "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==",
       "dev": true,
       "dependencies": {
-        "@jest/test-result": "^29.5.0",
-        "@jest/types": "^29.5.0",
+        "@jest/test-result": "^29.6.1",
+        "@jest/types": "^29.6.1",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
-        "jest-util": "^29.5.0",
+        "jest-util": "^29.6.1",
         "string-length": "^4.0.1"
       },
       "engines": {
@@ -6022,13 +5906,13 @@
       }
     },
     "node_modules/jest-worker": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz",
-      "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz",
+      "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==",
       "dev": true,
       "dependencies": {
         "@types/node": "*",
-        "jest-util": "^29.5.0",
+        "jest-util": "^29.6.1",
         "merge-stream": "^2.0.0",
         "supports-color": "^8.0.0"
       },
@@ -6051,16 +5935,6 @@
         "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
-    "node_modules/js-sdsl": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz",
-      "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==",
-      "dev": true,
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/js-sdsl"
-      }
-    },
     "node_modules/js-tokens": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -6078,24 +5952,21 @@
       }
     },
     "node_modules/jsdom": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-21.1.1.tgz",
-      "integrity": "sha512-Jjgdmw48RKcdAIQyUD1UdBh2ecH7VqwaXPN3ehoZN6MqgVbMn+lRm1aAT1AsdJRAJpwfa4IpwgzySn61h2qu3w==",
+      "version": "22.1.0",
+      "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-22.1.0.tgz",
+      "integrity": "sha512-/9AVW7xNbsBv6GfWho4TTNjEo9fe6Zhf9O7s0Fhhr3u+awPwAJMKwAMXnkk5vBxflqLW9hTHX/0cs+P3gW+cQw==",
       "dependencies": {
         "abab": "^2.0.6",
-        "acorn": "^8.8.2",
-        "acorn-globals": "^7.0.0",
         "cssstyle": "^3.0.0",
         "data-urls": "^4.0.0",
         "decimal.js": "^10.4.3",
         "domexception": "^4.0.0",
-        "escodegen": "^2.0.0",
         "form-data": "^4.0.0",
         "html-encoding-sniffer": "^3.0.0",
         "http-proxy-agent": "^5.0.0",
         "https-proxy-agent": "^5.0.1",
         "is-potential-custom-element-name": "^1.0.1",
-        "nwsapi": "^2.2.2",
+        "nwsapi": "^2.2.4",
         "parse5": "^7.1.2",
         "rrweb-cssom": "^0.6.0",
         "saxes": "^6.0.0",
@@ -6110,7 +5981,7 @@
         "xml-name-validator": "^4.0.0"
       },
       "engines": {
-        "node": ">=14"
+        "node": ">=16"
       },
       "peerDependencies": {
         "canvas": "^2.5.0"
@@ -6133,11 +6004,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/json-buffer": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
-      "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
-    },
     "node_modules/json-parse-even-better-errors": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -6167,12 +6033,12 @@
         "node": ">=6"
       }
     },
-    "node_modules/keyv": {
-      "version": "4.5.2",
-      "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
-      "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
-      "dependencies": {
-        "json-buffer": "3.0.1"
+    "node_modules/jsonfile": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+      "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
       }
     },
     "node_modules/kleur": {
@@ -6207,9 +6073,9 @@
       }
     },
     "node_modules/libxmljs2": {
-      "version": "0.31.0",
-      "resolved": "https://registry.npmjs.org/libxmljs2/-/libxmljs2-0.31.0.tgz",
-      "integrity": "sha512-+o8y4lhmmf7zUA67watbLcAcxE0lkBkuatoIwgFkWTmuFTPEOZKunNpSjW6V7ONzAj8Ey1qVeR12q1JMU/sTlQ==",
+      "version": "0.32.0",
+      "resolved": "https://registry.npmjs.org/libxmljs2/-/libxmljs2-0.32.0.tgz",
+      "integrity": "sha512-DuvKfSQZeUzw0A4UWZXfcBpr3VqlcJY1b3aw99PxTiX3T5t1rEO4gSpobNrP9S74LIhyDKaAs/lphuErV+n+7w==",
       "hasInstallScript": true,
       "optional": true,
       "dependencies": {
@@ -6218,7 +6084,7 @@
         "nan": "~2.17.0"
       },
       "engines": {
-        "node": ">=12"
+        "node": ">=16"
       }
     },
     "node_modules/lines-and-columns": {
@@ -6227,16 +6093,16 @@
       "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
     },
     "node_modules/linguist-js": {
-      "version": "2.5.4",
-      "resolved": "https://registry.npmjs.org/linguist-js/-/linguist-js-2.5.4.tgz",
-      "integrity": "sha512-sn0TNXtwizY8RElyN//O11b2Z7H0e/sYwIJzC39sxC+Keb4oD3QlFfBEL0iVNh7CLnZeONzIEWYxCe3x5wn+2g==",
+      "version": "2.6.1",
+      "resolved": "https://registry.npmjs.org/linguist-js/-/linguist-js-2.6.1.tgz",
+      "integrity": "sha512-sFnn892fNaPBiOWXnORgR8UCPbr90DRPVWo9x+Aq7jXzPXCtDI12F++fWqZ67Cr9/G5/X1vS496tCbnR28Xi2g==",
       "dependencies": {
         "binary-extensions": "^2.2.0",
-        "commander": "^9.5.0",
+        "commander": "^9.5.0 <10",
         "common-path-prefix": "^3.0.0",
-        "cross-fetch": "^3.1.5",
+        "cross-fetch": "^3.1.8 <4",
         "ignore": "^5.2.4",
-        "isbinaryfile": "^4.0.8 <5",
+        "isbinaryfile": "^4.0.10 <5",
         "js-yaml": "^4.1.0",
         "node-cache": "^5.1.2"
       },
@@ -6277,17 +6143,6 @@
       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
       "dev": true
     },
-    "node_modules/lowercase-keys": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
-      "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/lru-cache": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -6339,14 +6194,14 @@
       }
     },
     "node_modules/marked": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz",
-      "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==",
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.1.tgz",
+      "integrity": "sha512-bTmmGdEINWmOMDjnPWDxGPQ4qkDLeYorpYbEtFOXzOruTwUE671q4Guiuchn4N8h/v6NGd7916kXsm3Iz4iUSg==",
       "bin": {
         "marked": "bin/marked.js"
       },
       "engines": {
-        "node": ">= 12"
+        "node": ">= 18"
       }
     },
     "node_modules/mdn-data": {
@@ -6438,26 +6293,15 @@
         "node": ">=6"
       }
     },
-    "node_modules/mimic-response": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
-      "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/minimatch": {
-      "version": "7.4.3",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.3.tgz",
-      "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==",
+      "version": "9.0.3",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+      "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
       "dependencies": {
         "brace-expansion": "^2.0.1"
       },
       "engines": {
-        "node": ">=10"
+        "node": ">=16 || 14 >=14.17"
       },
       "funding": {
         "url": "https://github.com/sponsors/isaacs"
@@ -6574,6 +6418,14 @@
         "node": ">= 0.6"
       }
     },
+    "node_modules/netmask": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
+      "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
     "node_modules/node-abi": {
       "version": "3.33.0",
       "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz",
@@ -6586,9 +6438,9 @@
       }
     },
     "node_modules/node-addon-api": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.0.0.tgz",
-      "integrity": "sha512-GyHvgPvUXBvAkXa0YvYnhilSB1A+FRYMpIVggKzPZqdaZfevZOuzfWzyvgzOwRLHBeo/MMswmJFsrNF4Nw1pmA=="
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz",
+      "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA=="
     },
     "node_modules/node-cache": {
       "version": "5.1.2",
@@ -6643,9 +6495,9 @@
       "dev": true
     },
     "node_modules/node-releases": {
-      "version": "2.0.10",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz",
-      "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==",
+      "version": "2.0.13",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+      "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==",
       "dev": true
     },
     "node_modules/nopt": {
@@ -6672,17 +6524,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/normalize-url": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
-      "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==",
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/npm-run-path": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@@ -6719,9 +6560,9 @@
       }
     },
     "node_modules/nwsapi": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.2.tgz",
-      "integrity": "sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw=="
+      "version": "2.2.7",
+      "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
+      "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ=="
     },
     "node_modules/object-assign": {
       "version": "4.1.1",
@@ -6782,45 +6623,36 @@
       }
     },
     "node_modules/open-graph-scraper": {
-      "version": "5.2.3",
-      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-5.2.3.tgz",
-      "integrity": "sha512-OFKyI3Zv60onbwjUtwTdLwMB9P1O0+U2JV0HD4hHdwyKGwDhyM09udZVU5vEwe/PxI4MyPuVaxcdy1okc4SgWw==",
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/open-graph-scraper/-/open-graph-scraper-6.2.2.tgz",
+      "integrity": "sha512-cQO0c0HF9ZMhSoIEOKMyxbSYwKn6qWBDEdQeCvZnAVwKCxSWj2DV8AwC1J4JCiwZbn/C4grGCJXpvmlAyTXrBg==",
       "dependencies": {
-        "chardet": "^1.5.1",
+        "chardet": "^1.6.0",
         "cheerio": "^1.0.0-rc.12",
-        "got": "^12.6.0",
-        "iconv-lite": "^0.6.3",
+        "undici": "^5.22.1",
         "validator": "^13.9.0"
       },
       "engines": {
-        "node": ">=14.16"
+        "node": ">=18.0.0"
       }
     },
     "node_modules/optionator": {
-      "version": "0.9.1",
-      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
-      "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+      "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
       "dev": true,
       "dependencies": {
+        "@aashutoshrathi/word-wrap": "^1.2.3",
         "deep-is": "^0.1.3",
         "fast-levenshtein": "^2.0.6",
         "levn": "^0.4.1",
         "prelude-ls": "^1.2.1",
-        "type-check": "^0.4.0",
-        "word-wrap": "^1.2.3"
+        "type-check": "^0.4.0"
       },
       "engines": {
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/p-cancelable": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
-      "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
-      "engines": {
-        "node": ">=12.20"
-      }
-    },
     "node_modules/p-limit": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -6860,6 +6692,72 @@
         "node": ">=6"
       }
     },
+    "node_modules/pac-proxy-agent": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz",
+      "integrity": "sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA==",
+      "dependencies": {
+        "@tootallnate/quickjs-emscripten": "^0.23.0",
+        "agent-base": "^7.0.2",
+        "debug": "^4.3.4",
+        "get-uri": "^6.0.1",
+        "http-proxy-agent": "^7.0.0",
+        "https-proxy-agent": "^7.0.0",
+        "pac-resolver": "^7.0.0",
+        "socks-proxy-agent": "^8.0.1"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/pac-proxy-agent/node_modules/agent-base": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
+      "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+      "dependencies": {
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
+      "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
+      "dependencies": {
+        "agent-base": "^7.1.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz",
+      "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==",
+      "dependencies": {
+        "agent-base": "^7.0.2",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/pac-resolver": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz",
+      "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==",
+      "dependencies": {
+        "degenerator": "^5.0.0",
+        "ip": "^1.1.8",
+        "netmask": "^2.0.2"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
     "node_modules/parent-module": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -7005,9 +6903,9 @@
       }
     },
     "node_modules/pirates": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
-      "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+      "version": "4.0.6",
+      "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+      "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
       "dev": true,
       "engines": {
         "node": ">= 6"
@@ -7176,12 +7074,12 @@
       }
     },
     "node_modules/pretty-format": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
-      "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
+      "version": "29.6.1",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz",
+      "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==",
       "dev": true,
       "dependencies": {
-        "@jest/schemas": "^29.4.3",
+        "@jest/schemas": "^29.6.0",
         "ansi-styles": "^5.0.0",
         "react-is": "^18.0.0"
       },
@@ -7242,6 +7140,67 @@
         "node": ">= 0.10"
       }
     },
+    "node_modules/proxy-agent": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz",
+      "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==",
+      "dependencies": {
+        "agent-base": "^7.0.2",
+        "debug": "^4.3.4",
+        "http-proxy-agent": "^7.0.0",
+        "https-proxy-agent": "^7.0.0",
+        "lru-cache": "^7.14.1",
+        "pac-proxy-agent": "^7.0.0",
+        "proxy-from-env": "^1.1.0",
+        "socks-proxy-agent": "^8.0.1"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/agent-base": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
+      "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+      "dependencies": {
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/http-proxy-agent": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
+      "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
+      "dependencies": {
+        "agent-base": "^7.1.0",
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/https-proxy-agent": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz",
+      "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==",
+      "dependencies": {
+        "agent-base": "^7.0.2",
+        "debug": "4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/proxy-agent/node_modules/lru-cache": {
+      "version": "7.18.3",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/proxy-from-env": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -7270,37 +7229,33 @@
       }
     },
     "node_modules/puppeteer": {
-      "version": "19.8.2",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-19.8.2.tgz",
-      "integrity": "sha512-LPdNVYMR6ddp4YS3GK1bqKsasCJj1aZjt9dNOKcnzKezuMoishlHY6bCnFLjTc34iqnGzIrJp07TQ9M+aML2+g==",
+      "version": "20.9.0",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-20.9.0.tgz",
+      "integrity": "sha512-kAglT4VZ9fWEGg3oLc4/de+JcONuEJhlh3J6f5R1TLkrY/EHHIHxWXDOzXvaxQCtedmyVXBwg8M+P8YCO/wZjw==",
       "hasInstallScript": true,
       "dependencies": {
-        "@puppeteer/browsers": "0.3.1",
-        "cosmiconfig": "8.1.3",
-        "https-proxy-agent": "5.0.1",
-        "progress": "2.0.3",
-        "proxy-from-env": "1.1.0",
-        "puppeteer-core": "19.8.1"
+        "@puppeteer/browsers": "1.4.6",
+        "cosmiconfig": "8.2.0",
+        "puppeteer-core": "20.9.0"
+      },
+      "engines": {
+        "node": ">=16.3.0"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "19.8.1",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-19.8.1.tgz",
-      "integrity": "sha512-7yPMzusYRvJ/laLaMFIQ01E9WakKkJJXLsMAymH6y5EKqYe5hhn68/SbvF+1YJMb843GftU7gT86Fw8y5jkn3w==",
+      "version": "20.9.0",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz",
+      "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==",
       "dependencies": {
-        "chromium-bidi": "0.4.6",
-        "cross-fetch": "3.1.5",
+        "@puppeteer/browsers": "1.4.6",
+        "chromium-bidi": "0.4.16",
+        "cross-fetch": "4.0.0",
         "debug": "4.3.4",
-        "devtools-protocol": "0.0.1107588",
-        "extract-zip": "2.0.1",
-        "https-proxy-agent": "5.0.1",
-        "proxy-from-env": "1.1.0",
-        "tar-fs": "2.1.1",
-        "unbzip2-stream": "1.4.3",
+        "devtools-protocol": "0.0.1147663",
         "ws": "8.13.0"
       },
       "engines": {
-        "node": ">=14.14.0"
+        "node": ">=16.3.0"
       },
       "peerDependencies": {
         "typescript": ">= 4.7.4"
@@ -7311,10 +7266,56 @@
         }
       }
     },
+    "node_modules/puppeteer-core/node_modules/cross-fetch": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
+      "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
+      "dependencies": {
+        "node-fetch": "^2.6.12"
+      }
+    },
+    "node_modules/puppeteer-core/node_modules/node-fetch": {
+      "version": "2.6.12",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
+      "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/puppeteer-core/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
+    "node_modules/puppeteer-core/node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    },
+    "node_modules/puppeteer-core/node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
     "node_modules/pure-rand": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.1.tgz",
-      "integrity": "sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz",
+      "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==",
       "dev": true,
       "funding": [
         {
@@ -7435,16 +7436,10 @@
         }
       ]
     },
-    "node_modules/quick-lru": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
-      "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
+    "node_modules/queue-tick": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
+      "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag=="
     },
     "node_modules/range-parser": {
       "version": "1.2.1",
@@ -7557,12 +7552,12 @@
       "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
     },
     "node_modules/resolve": {
-      "version": "1.22.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
-      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+      "version": "1.22.2",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
+      "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
       "dev": true,
       "dependencies": {
-        "is-core-module": "^2.9.0",
+        "is-core-module": "^2.11.0",
         "path-parse": "^1.0.7",
         "supports-preserve-symlinks-flag": "^1.0.0"
       },
@@ -7573,11 +7568,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/resolve-alpn": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
-      "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
-    },
     "node_modules/resolve-cwd": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -7608,28 +7598,14 @@
       }
     },
     "node_modules/resolve.exports": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.1.tgz",
-      "integrity": "sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==",
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
+      "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
       "dev": true,
       "engines": {
         "node": ">=10"
       }
     },
-    "node_modules/responselike": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
-      "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
-      "dependencies": {
-        "lowercase-keys": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/retry-axios": {
       "version": "2.6.0",
       "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-2.6.0.tgz",
@@ -7764,9 +7740,9 @@
       "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "node_modules/sanitize-html": {
-      "version": "2.10.0",
-      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.10.0.tgz",
-      "integrity": "sha512-JqdovUd81dG4k87vZt6uA6YhDfWkUGruUu/aPmXLxXi45gZExnt9Bnw/qeQU8oGf82vPyaE0vO4aH0PbobB9JQ==",
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.11.0.tgz",
+      "integrity": "sha512-BG68EDHRaGKqlsNjJ2xUB7gpInPA8gVx/mvjO743hZaeMCZ2DwzW7xvsqZ+KNU4QKwj86HJ3uu2liISf2qBBUA==",
       "dependencies": {
         "deepmerge": "^4.2.2",
         "escape-string-regexp": "^4.0.0",
@@ -7798,9 +7774,9 @@
       "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
     },
     "node_modules/semver": {
-      "version": "7.3.8",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
-      "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+      "version": "7.5.4",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
       "dependencies": {
         "lru-cache": "^6.0.0"
       },
@@ -7894,18 +7870,18 @@
       "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
     },
     "node_modules/sharp": {
-      "version": "0.32.0",
-      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.0.tgz",
-      "integrity": "sha512-yLAypVcqj1toSAqRSwbs86nEzfyZVDYqjuUX8grhFpeij0DDNagKJXELS/auegDBRDg1XBtELdOGfo2X1cCpeA==",
+      "version": "0.32.4",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.4.tgz",
+      "integrity": "sha512-exUnZewqVZC6UXqXuQ8fyJJv0M968feBi04jb9GcUHrWtkRoAKnbJt8IfwT4NJs7FskArbJ14JAFGVuooszoGg==",
       "hasInstallScript": true,
       "dependencies": {
         "color": "^4.2.3",
-        "detect-libc": "^2.0.1",
-        "node-addon-api": "^6.0.0",
+        "detect-libc": "^2.0.2",
+        "node-addon-api": "^6.1.0",
         "prebuild-install": "^7.1.1",
-        "semver": "^7.3.8",
+        "semver": "^7.5.4",
         "simple-get": "^4.0.1",
-        "tar-fs": "^2.1.1",
+        "tar-fs": "^3.0.4",
         "tunnel-agent": "^0.6.0"
       },
       "engines": {
@@ -7939,6 +7915,26 @@
         "simple-concat": "^1.0.0"
       }
     },
+    "node_modules/sharp/node_modules/tar-fs": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
+      "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
+      "dependencies": {
+        "mkdirp-classic": "^0.5.2",
+        "pump": "^3.0.0",
+        "tar-stream": "^3.1.5"
+      }
+    },
+    "node_modules/sharp/node_modules/tar-stream": {
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
+      "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
+      "dependencies": {
+        "b4a": "^1.6.4",
+        "fast-fifo": "^1.2.0",
+        "streamx": "^2.15.0"
+      }
+    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -8034,9 +8030,9 @@
       }
     },
     "node_modules/simple-git": {
-      "version": "3.17.0",
-      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.17.0.tgz",
-      "integrity": "sha512-JozI/s8jr3nvLd9yn2jzPVHnhVzt7t7QWfcIoDcqRIGN+f1IINGv52xoZti2kkYfoRhhRvzMSNPfogHMp97rlw==",
+      "version": "3.19.1",
+      "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.19.1.tgz",
+      "integrity": "sha512-Ck+rcjVaE1HotraRAS8u/+xgTvToTuoMkT9/l9lvuP5jftwnYUp6DwuJzsKErHgfyRk8IB8pqGHWEbM3tLgV1w==",
       "dependencies": {
         "@kwsites/file-exists": "^1.1.1",
         "@kwsites/promise-deferred": "^1.1.1",
@@ -8075,6 +8071,57 @@
         "node": ">=8"
       }
     },
+    "node_modules/smart-buffer": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+      "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+      "engines": {
+        "node": ">= 6.0.0",
+        "npm": ">= 3.0.0"
+      }
+    },
+    "node_modules/socks": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
+      "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+      "dependencies": {
+        "ip": "^2.0.0",
+        "smart-buffer": "^4.2.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0",
+        "npm": ">= 3.0.0"
+      }
+    },
+    "node_modules/socks-proxy-agent": {
+      "version": "8.0.1",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz",
+      "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==",
+      "dependencies": {
+        "agent-base": "^7.0.1",
+        "debug": "^4.3.4",
+        "socks": "^2.7.1"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/socks-proxy-agent/node_modules/agent-base": {
+      "version": "7.1.0",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
+      "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+      "dependencies": {
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": ">= 14"
+      }
+    },
+    "node_modules/socks/node_modules/ip": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
+      "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ=="
+    },
     "node_modules/source-map": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -8110,6 +8157,12 @@
         "node": ">=6"
       }
     },
+    "node_modules/sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+      "dev": true
+    },
     "node_modules/stack-utils": {
       "version": "2.0.6",
       "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
@@ -8139,6 +8192,23 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/streamsearch": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
+      "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/streamx": {
+      "version": "2.15.0",
+      "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz",
+      "integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==",
+      "dependencies": {
+        "fast-fifo": "^1.1.0",
+        "queue-tick": "^1.0.1"
+      }
+    },
     "node_modules/strict-uri-encode": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
@@ -8491,6 +8561,11 @@
         "node": ">=14"
       }
     },
+    "node_modules/tslib": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
+      "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+    },
     "node_modules/tunnel": {
       "version": "0.0.6",
       "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
@@ -8564,6 +8639,17 @@
         "through": "^2.3.8"
       }
     },
+    "node_modules/undici": {
+      "version": "5.22.1",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz",
+      "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==",
+      "dependencies": {
+        "busboy": "^1.6.0"
+      },
+      "engines": {
+        "node": ">=14.0"
+      }
+    },
     "node_modules/universal-user-agent": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
@@ -8586,9 +8672,9 @@
       }
     },
     "node_modules/update-browserslist-db": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
-      "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+      "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
       "dev": true,
       "funding": [
         {
@@ -8598,6 +8684,10 @@
         {
           "type": "tidelift",
           "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
         }
       ],
       "dependencies": {
@@ -8605,7 +8695,7 @@
         "picocolors": "^1.0.0"
       },
       "bin": {
-        "browserslist-lint": "cli.js"
+        "update-browserslist-db": "cli.js"
       },
       "peerDependencies": {
         "browserslist": ">= 4.21.0"
@@ -8791,14 +8881,6 @@
         "string-width": "^1.0.2 || 2 || 3 || 4"
       }
     },
-    "node_modules/word-wrap": {
-      "version": "1.2.3",
-      "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
-      "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/wrap-ansi": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -8860,11 +8942,11 @@
       "optional": true
     },
     "node_modules/xml-formatter": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-3.3.2.tgz",
-      "integrity": "sha512-ld34F1b7+2UQGNkfsAV4MN3/b7cdUstyMj3XJhzKFasOPtMToVCkqmrNcmrRuSlPxgH1K9tXPkqr75gAT3ix2g==",
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-3.4.1.tgz",
+      "integrity": "sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==",
       "dependencies": {
-        "xml-parser-xo": "^4.0.3"
+        "xml-parser-xo": "^4.1.0"
       },
       "engines": {
         "node": ">= 14"
@@ -8879,9 +8961,9 @@
       }
     },
     "node_modules/xml-parser-xo": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-4.0.5.tgz",
-      "integrity": "sha512-UWXOHMQ4ySxpUiU3S/9KzPOhninlL8SN1xFfWgX9WjgoZWoLKtEeJIEz4jhKtdFsoZBCYjg9rDEP3qfnpiHagQ==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/xml-parser-xo/-/xml-parser-xo-4.1.1.tgz",
+      "integrity": "sha512-Ggf2y90+Y6e9IK5hoPuembVHJ03PhDSdhldEmgzbihzu9k0XBo0sfcFxaSi4W1PlUSSI1ok+MJ0JCXUn+U4Ilw==",
       "engines": {
         "node": ">= 14"
       }
diff --git a/package.json b/package.json
index c0ceab442c5..72d644b92c6 100644
--- a/package.json
+++ b/package.json
@@ -31,47 +31,47 @@
   "dependencies": {
     "@actions/core": "^1.10.0",
     "@actions/github": "^5.1.1",
-    "@faker-js/faker": "^7.6.0",
-    "@octokit/graphql": "^5.0.5",
-    "@octokit/rest": "^19.0.7",
-    "@primer/css": "^21.0.0",
-    "@primer/octicons": "^18.3.0",
+    "@faker-js/faker": "^8.0.2",
+    "@octokit/graphql": "^7.0.1",
+    "@octokit/rest": "^20.0.1",
+    "@primer/css": "^21.0.7",
+    "@primer/octicons": "^19.4.0",
     "@twemoji/parser": "^14.1.0",
-    "axios": "^1.3.4",
+    "axios": "^1.4.0",
     "clipboard": "^2.0.11",
     "compression": "^1.7.4",
     "csso": "^5.0.5",
-    "d3": "^7.8.3",
+    "d3": "^7.8.5",
     "ejs": "^3.1.9",
     "emoji-name-map": "^1.2.9",
     "express": "^4.18.2",
-    "express-rate-limit": "^6.7.0",
-    "file-type": "^18.2.1",
+    "express-rate-limit": "^6.8.0",
+    "file-type": "^18.5.0",
     "js-yaml": "^4.1.0",
-    "jsdom": "^21.1.1",
-    "linguist-js": "^2.5.4",
-    "marked": "^4.3.0",
+    "jsdom": "^22.1.0",
+    "linguist-js": "^2.6.1",
+    "marked": "^5.1.1",
     "memory-cache": "^0.2.0",
-    "minimatch": "^7.4.3",
+    "minimatch": "^9.0.3",
     "node-fetch": "^3.3.1",
-    "open-graph-scraper": "^5.2.3",
+    "open-graph-scraper": "^6.2.2",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^19.8.2",
+    "puppeteer": "^20.9.0",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.13.0",
-    "sanitize-html": "^2.10.0",
-    "sharp": "^0.32.0",
-    "simple-git": "^3.17.0",
+    "sanitize-html": "^2.11.0",
+    "sharp": "^0.32.4",
+    "simple-git": "^3.19.1",
     "svgo": "^3.0.2",
     "vue": "^2.7.1",
     "vue-prism-component": "^1.2.0",
-    "xml-formatter": "^3.3.2"
+    "xml-formatter": "^3.4.1"
   },
   "devDependencies": {
     "dprint": "^0.35.1",
-    "eslint": "^8.38.0",
-    "jest": "^29.5.0"
+    "eslint": "^8.45.0",
+    "jest": "^29.6.1"
   },
   "jest": {
     "testEnvironment": "node",
@@ -79,11 +79,11 @@
     "transform": {}
   },
   "optionalDependencies": {
-    "@googlemaps/google-maps-services-js": "^3.3.27",
-    "chess.js": "^1.0.0-beta.3",
+    "@googlemaps/google-maps-services-js": "^3.3.34",
+    "chess.js": "^1.0.0-beta.6",
     "color": "^4.2.3",
     "gifencoder": "^2.0.1",
-    "libxmljs2": "^0.31.0",
+    "libxmljs2": "^0.32.0",
     "rss": "^1.2.2",
     "yargs-parser": "^21.1.1"
   }

From 7339a6e77123d48d39b6adc103476d79c6f48eaf Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 24 Jul 2023 13:07:26 -0400
Subject: [PATCH 134/196] fix: deps upgrade

---
 .github/scripts/markdown_example.mjs | 2 +-
 source/app/metrics/utils.mjs         | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/.github/scripts/markdown_example.mjs b/.github/scripts/markdown_example.mjs
index 3074d39ee2c..2859015b73e 100644
--- a/.github/scripts/markdown_example.mjs
+++ b/.github/scripts/markdown_example.mjs
@@ -3,7 +3,7 @@ import puppeteer from "puppeteer"
 
 //Setup browser
 const browser = await puppeteer.launch({
-  headless: true,
+  headless: "new",
   executablePath: process.env.PUPPETEER_BROWSER_PATH,
   args: ["--no-sandbox", "--disable-extensions", "--disable-setuid-sandbox", "--disable-dev-shm-usage"],
   ignoreDefaultArgs: ["--disable-extensions"],
diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 464e0d58ba8..6a10bd0a5d5 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -13,7 +13,7 @@ import fs from "fs/promises"
 import { JSDOM } from "jsdom"
 import linguist from "linguist-js"
 import { marked } from "marked"
-import minimatch from "minimatch"
+import { minimatch } from "minimatch"
 import fetch from "node-fetch"
 import opengraph from "open-graph-scraper"
 import os from "os"
@@ -51,7 +51,7 @@ export const puppeteer = {
       ignoreDefaultArgs: ["--disable-extensions"],
     })
   },
-  headless: true,
+  headless: "new",
   events: ["load", "domcontentloaded", "networkidle2"],
 }
 

From 8bf2772d8d4caa0ba98862c3ce03e86903d413a8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=B9=A4=E7=BF=94=E4=B8=87=E9=87=8C?=
 <tonycrane@foxmail.com>
Date: Tue, 25 Jul 2023 01:13:01 +0800
Subject: [PATCH 135/196] fix(achievements): update total data acquisition
 method (#1487)

---
 source/plugins/achievements/index.mjs | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/source/plugins/achievements/index.mjs b/source/plugins/achievements/index.mjs
index 3a19b15d0fb..25465b32109 100644
--- a/source/plugins/achievements/index.mjs
+++ b/source/plugins/achievements/index.mjs
@@ -82,13 +82,16 @@ async function total({imports}) {
       //Extracting total from github.com/search
       for (let i = 0; (i < 100) && ((!total.users) || (!total.repositories)); i++) {
         const page = await browser.newPage()
-        await page.goto("https://github.com/search")
-        const result = await page.evaluate(() => [...document.querySelectorAll("h2")].filter(node => /Search more/.test(node.innerText)).shift()?.innerText.trim().match(/(?<count>\d+)M\s+(?<type>repositories|users|issues)$/)?.groups) ?? null
-        console.debug(`metrics/compute/plugins > achievements > setup found ${result?.type ?? "(?)"}`)
-        if ((result?.type) && (!total[result.type])) {
-          const {count, type} = result
-          total[type] = Number(count) * 10e5
-          console.debug(`metrics/compute/plugins > achievements > set total.${type} to ${total[type]}`)
+        await page.goto("https://github.com/search?q=+created%3A%3E2007")
+        const results = await page.evaluate(() => [...[...document.querySelectorAll("h2")].filter(node => /Filter by/.test(node.innerText)).shift()?.nextSibling?.innerText.trim().matchAll(/(?<type>Repositories|Users|Issues)\n(?<count>.*?)M/g) ?? []]) ?? null
+        for (const result of results) {
+          const type = result[1]?.toLowerCase()
+          console.debug(`metrics/compute/plugins > achievements > setup found ${type ?? "(?)"}`)
+          const count = result[2] ?? ""
+          if ((count !== "") && (!total[type])) {
+            total[type] = Number(count) * 10e5
+            console.debug(`metrics/compute/plugins > achievements > set total.${type} to ${total[type]}`)
+          }
         }
         await page.close()
         await imports.wait(10 * Math.random())

From fca0e34e9db04270444b001ed34c05a53463ca18 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 24 Jul 2023 13:22:15 -0400
Subject: [PATCH 136/196] chore: deprecate tweets plugin

---
 .github/workflows/examples.yml     | 30 ---------------------
 README.md                          | 42 +++++++++++-------------------
 source/plugins/README.md           |  2 +-
 source/plugins/tweets/README.md    |  2 ++
 source/plugins/tweets/examples.yml |  8 ++++++
 source/plugins/tweets/metadata.yml |  2 ++
 tests/cases/tweets.plugin.yml      | 21 +--------------
 7 files changed, 29 insertions(+), 78 deletions(-)

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index ad43189459d..1d9709b1027 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -874,36 +874,6 @@ jobs:
           user: lowlighter
           plugins_errors_fatal: yes
         if: ${{ success() || failure() }}
-      - name: 🐤 Latest tweets - Latest tweets
-        uses: lowlighter/metrics@master
-        with:
-          filename: metrics.plugin.tweets.svg
-          token: NOT_NEEDED
-          base: ""
-          plugin_tweets: yes
-          plugin_tweets_token: ${{ secrets.TWITTER_TOKEN }}
-          plugin_tweets_user: github
-          output_action: none
-          delay: 120
-          user: lowlighter
-          plugins_errors_fatal: yes
-        if: ${{ success() || failure() }}
-      - name: 🐤 Latest tweets - Latest tweets including attachments
-        uses: lowlighter/metrics@master
-        with:
-          filename: metrics.plugin.tweets.attachments.svg
-          token: NOT_NEEDED
-          base: ""
-          plugin_tweets: yes
-          plugin_tweets_token: ${{ secrets.TWITTER_TOKEN }}
-          plugin_tweets_attachments: yes
-          plugin_tweets_user: github
-          plugin_tweets_limit: 1
-          output_action: none
-          delay: 120
-          user: lowlighter
-          plugins_errors_fatal: yes
-        if: ${{ success() || failure() }}
       - name: 🗨️ Stack Overflow - Top answers from stackoverflow
         uses: lowlighter/metrics@master
         with:
diff --git a/README.md b/README.md
index fe63843a3d9..139e0e01d80 100644
--- a/README.md
+++ b/README.md
@@ -243,77 +243,65 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
       </td>
   </tr>
   <tr>
-    <th><a href="source/plugins/tweets/README.md">🐤 Latest tweets</a></th>
     <th><a href="source/plugins/stackoverflow/README.md">🗨️ Stack Overflow</a></th>
+    <th><a href="source/plugins/anilist/README.md">🌸 Anilist watch list and reading list</a></th>
   </tr>
   <tr>
-        <td  align="center">
-        <details open><summary>Latest tweets with attachments</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.tweets.attachments.svg" alt=""></img></details>
-        <details><summary>Latest tweets</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.tweets.svg" alt=""></img></details>
-        <img width="900" height="1" alt="">
-      </td>
         <td  align="center">
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stackoverflow.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </td>
-  </tr>
-  <tr>
-    <th><a href="source/plugins/anilist/README.md">🌸 Anilist watch list and reading list</a></th>
-    <th><a href="source/plugins/music/README.md">🎼 Music activity and suggestions</a></th>
-  </tr>
-  <tr>
         <td  align="center">
         <details open><summary>For anime watchers</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.anilist.svg" alt=""></img></details>
         <details><summary>For manga readers</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.anilist.manga.svg" alt=""></img></details>
         <details open><summary>For waifus simp</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.anilist.characters.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
-        <td  align="center">
-        <details open><summary>Random tracks from a playlist</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.music.playlist.svg" alt=""></img></details>
-        <details open><summary>Recently listened</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.music.recent.svg" alt=""></img></details>
-        <img width="900" height="1" alt="">
-      </td>
   </tr>
   <tr>
+    <th><a href="source/plugins/music/README.md">🎼 Music activity and suggestions</a></th>
     <th><a href="source/plugins/posts/README.md">✒️ Recent posts</a></th>
-    <th><a href="source/plugins/rss/README.md">🗼 Rss feed</a></th>
   </tr>
   <tr>
         <td  align="center">
-        <details open><summary>Latest posts width description and cover image</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.posts.full.svg" alt=""></img></details>
-        <details><summary>Latest posts</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.posts.svg" alt=""></img></details>
+        <details open><summary>Random tracks from a playlist</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.music.playlist.svg" alt=""></img></details>
+        <details open><summary>Recently listened</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.music.recent.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
         <td  align="center">
-        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.rss.svg" alt=""></img>
+        <details open><summary>Latest posts width description and cover image</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.posts.full.svg" alt=""></img></details>
+        <details><summary>Latest posts</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.posts.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
   </tr>
   <tr>
+    <th><a href="source/plugins/rss/README.md">🗼 Rss feed</a></th>
     <th><a href="source/plugins/wakatime/README.md">⏰ WakaTime</a></th>
-    <th><a href="source/plugins/leetcode/README.md">🗳️ Leetcode</a></th>
   </tr>
   <tr>
         <td  align="center">
-        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.wakatime.svg" alt=""></img>
+        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.rss.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </td>
         <td  align="center">
-        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.leetcode.svg" alt=""></img>
+        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.wakatime.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </td>
   </tr>
   <tr>
+    <th><a href="source/plugins/leetcode/README.md">🗳️ Leetcode</a></th>
     <th><a href="source/plugins/steam/README.md">🕹️ Steam</a></th>
-    <th></th>
   </tr>
   <tr>
+        <td  align="center">
+        <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.leetcode.svg" alt=""></img>
+        <img width="900" height="1" alt="">
+      </td>
         <td  align="center">
         <details open><summary>Recently played games</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.steam.svg" alt=""></img></details>
         <details><summary>Profile and detailed game history</summary><img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.steam.full.svg" alt=""></img></details>
         <img width="900" height="1" alt="">
       </td>
-    <td align="center"><img width="900" height="1" alt=""></td>
   </tr>
   <tr>
     <th colspan="2" align="center">
@@ -532,7 +520,7 @@ Plugins provide additional content and lets you customize rendered metrics.
   * [🗼 Rss feed <sub>`rss`</sub>](/source/plugins/rss/README.md)
   * [🗨️ Stack Overflow <sub>`stackoverflow`</sub>](/source/plugins/stackoverflow/README.md)
   * [🕹️ Steam <sub>`steam`</sub>](/source/plugins/steam/README.md)
-  * [🐤 Latest tweets <sub>`tweets`</sub>](/source/plugins/tweets/README.md)
+  * [🐤 Latest tweets <sub>`tweets`</sub>](/source/plugins/tweets/README.md) <sub>`⚠️ deprecated`</sub>
   * [⏰ WakaTime <sub>`wakatime`</sub>](/source/plugins/wakatime/README.md)
 
 **🎲 Maintained by community**
diff --git a/source/plugins/README.md b/source/plugins/README.md
index d7b7345d7a9..149282f912c 100644
--- a/source/plugins/README.md
+++ b/source/plugins/README.md
@@ -45,7 +45,7 @@ Plugins provide additional content and lets you customize rendered metrics.
   * [🗼 Rss feed <sub>`rss`</sub>](/source/plugins/rss/README.md)
   * [🗨️ Stack Overflow <sub>`stackoverflow`</sub>](/source/plugins/stackoverflow/README.md)
   * [🕹️ Steam <sub>`steam`</sub>](/source/plugins/steam/README.md)
-  * [🐤 Latest tweets <sub>`tweets`</sub>](/source/plugins/tweets/README.md)
+  * [🐤 Latest tweets <sub>`tweets`</sub>](/source/plugins/tweets/README.md) <sub>`⚠️ deprecated`</sub>
   * [⏰ WakaTime <sub>`wakatime`</sub>](/source/plugins/wakatime/README.md)
 
 **🎲 Maintained by community**
diff --git a/source/plugins/tweets/README.md b/source/plugins/tweets/README.md
index 74d8f398057..c1e903cdf85 100644
--- a/source/plugins/tweets/README.md
+++ b/source/plugins/tweets/README.md
@@ -3,6 +3,8 @@
   <tr><td colspan="2"><a href="/README.md#-plugins">← Back to plugins index</a></td></tr>
   <tr><th colspan="2"><h3>🐤 Latest tweets</h3></th></tr>
   <tr><td colspan="2" align="center"><p>This plugin displays the latest tweets from a <a href="https://twitter.com">Twitter</a> account.</p>
+</td></tr>
+  <tr><th>⚠️ Deprecated</th><td><p>As <a href="https://twitter.com">Twitter</a> removed the ability to fetch tweets from their free API as part of their new <a href="https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api">pricing policy</a>, this plugin is no longer maintained.</p>
 </td></tr>
   <tr><th>⚠️ Disclaimer</th><td><p>This plugin is not affiliated, associated, authorized, endorsed by, or in any way officially connected with <a href="https://twitter.com">Twitter</a>.
 All product and company names are trademarks™ or registered® trademarks of their respective holders.</p>
diff --git a/source/plugins/tweets/examples.yml b/source/plugins/tweets/examples.yml
index 6a0128f0ed3..9d0f64536bb 100644
--- a/source/plugins/tweets/examples.yml
+++ b/source/plugins/tweets/examples.yml
@@ -7,6 +7,10 @@
     plugin_tweets: yes
     plugin_tweets_token: ${{ secrets.TWITTER_TOKEN }}
     plugin_tweets_user: github
+  prod:
+    skip: true
+  test:
+    skip: true
 
 - name: Latest tweets including attachments
   uses: lowlighter/metrics@latest
@@ -19,3 +23,7 @@
     plugin_tweets_attachments: yes
     plugin_tweets_user: github
     plugin_tweets_limit: 1
+  prod:
+    skip: true
+  test:
+    skip: true
diff --git a/source/plugins/tweets/metadata.yml b/source/plugins/tweets/metadata.yml
index 929b91a766c..fdb56b5cde9 100644
--- a/source/plugins/tweets/metadata.yml
+++ b/source/plugins/tweets/metadata.yml
@@ -5,6 +5,8 @@ description: |
 disclaimer: |
   This plugin is not affiliated, associated, authorized, endorsed by, or in any way officially connected with [Twitter](https://twitter.com).
   All product and company names are trademarks™ or registered® trademarks of their respective holders.
+deprecation: |
+  As [Twitter](https://twitter.com) removed the ability to fetch tweets from their free API as part of their new [pricing policy](https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api), this plugin is no longer maintained.
 examples:
   +latest tweets with attachments: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.tweets.attachments.svg
   latest tweets: https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.tweets.svg
diff --git a/tests/cases/tweets.plugin.yml b/tests/cases/tweets.plugin.yml
index 62e8c583cb9..fe51488c706 100644
--- a/tests/cases/tweets.plugin.yml
+++ b/tests/cases/tweets.plugin.yml
@@ -1,20 +1 @@
-- name: 🐤 Latest tweets - Latest tweets
-  uses: lowlighter/metrics@latest
-  with:
-    token: NOT_NEEDED
-    plugin_tweets: 'yes'
-    plugin_tweets_token: MOCKED_TOKEN
-    plugin_tweets_user: github
-    use_mocked_data: 'yes'
-    verify: 'yes'
-- name: 🐤 Latest tweets - Latest tweets including attachments
-  uses: lowlighter/metrics@latest
-  with:
-    token: NOT_NEEDED
-    plugin_tweets: 'yes'
-    plugin_tweets_token: MOCKED_TOKEN
-    plugin_tweets_attachments: 'yes'
-    plugin_tweets_user: github
-    plugin_tweets_limit: 1
-    use_mocked_data: 'yes'
-    verify: 'yes'
+[]

From 0fad2fb0cb26fd82bb3cdbffadd9c025c79d07d0 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 24 Jul 2023 20:30:19 -0400
Subject: [PATCH 137/196] chore: update faker functions

---
 .../app/web/statics/embed/app.placeholder.js  | 576 +++++++++---------
 tests/mocks/api/axios/get/lastfm.mjs          |  12 +-
 tests/mocks/api/axios/get/nightscout.mjs      |   6 +-
 tests/mocks/api/axios/get/pagespeed.mjs       |  44 +-
 tests/mocks/api/axios/get/poopmap.mjs         |  12 +-
 tests/mocks/api/axios/get/spotify.mjs         |  12 +-
 tests/mocks/api/axios/get/stackoverflow.mjs   |  50 +-
 tests/mocks/api/axios/get/steam.mjs           |   2 +-
 tests/mocks/api/axios/get/twitter.mjs         |  16 +-
 tests/mocks/api/axios/get/wakatime.mjs        |  22 +-
 tests/mocks/api/axios/get/yahoo.mjs           |  18 +-
 tests/mocks/api/axios/post/anilist.mjs        |  30 +-
 tests/mocks/api/axios/post/leetcode.mjs       |  18 +-
 tests/mocks/api/axios/post/youtubemusic.mjs   |   6 +-
 .../github/graphql/achievements.default.mjs   |  34 +-
 .../graphql/achievements.organizations.mjs    |  14 +-
 .../github/graphql/achievements.ranking.mjs   |  12 +-
 .../api/github/graphql/base.contributions.mjs |  12 +-
 tests/mocks/api/github/graphql/base.field.mjs |  20 +-
 .../graphql/base.field.repositories.mjs       |   2 +-
 .../api/github/graphql/base.repositories.mjs  |  38 +-
 .../api/github/graphql/base.repository.mjs    |  36 +-
 tests/mocks/api/github/graphql/base.user.mjs  |   8 +-
 .../api/github/graphql/calendar.default.mjs   |   2 +-
 .../github/graphql/discussions.comments.mjs   |   2 +-
 .../github/graphql/discussions.statistics.mjs |   6 +-
 .../github/graphql/followup.repository.mjs    |  16 +-
 .../api/github/graphql/followup.user.mjs      |  16 +-
 .../api/github/graphql/gists.default.mjs      |  14 +-
 .../github/graphql/isocalendar.calendar.mjs   |   2 +-
 .../github/graphql/notable.contributions.mjs  |  10 +-
 .../api/github/graphql/notable.issues.mjs     |   2 +-
 .../graphql/projects.repository.legacy.mjs    |   6 +-
 .../github/graphql/projects.repository.mjs    |   2 +-
 .../github/graphql/projects.user.legacy.mjs   |   6 +-
 .../api/github/graphql/projects.user.mjs      |   2 +-
 .../github/graphql/repositories.pinned.mjs    |   8 +-
 .../graphql/repositories.repository.mjs       |   8 +-
 .../api/github/graphql/sponsors.active.mjs    |   2 +-
 .../mocks/api/github/graphql/sponsors.all.mjs |   2 +-
 .../github/graphql/sponsors.description.mjs   |   2 +-
 .../github/graphql/sponsorships.default.mjs   |   2 +-
 .../api/github/graphql/stargazers.default.mjs |   6 +-
 .../api/github/graphql/stars.default.mjs      |  10 +-
 .../listEventsForAuthenticatedUser.mjs        |  72 +--
 tests/mocks/api/github/rest/repos/get.mjs     |   4 +-
 .../rest/repos/getContributorsStats.mjs       |  10 +-
 .../mocks/api/github/rest/repos/getViews.mjs  |   4 +-
 .../api/github/rest/repos/listCommits.mjs     |   4 +-
 .../github/rest/repos/listContributors.mjs    |   4 +-
 tests/mocks/api/github/rest/request.mjs       |   8 +-
 .../api/github/rest/users/getByUsername.mjs   |   2 +-
 tests/mocks/index.mjs                         |  10 +-
 53 files changed, 622 insertions(+), 622 deletions(-)

diff --git a/source/app/web/statics/embed/app.placeholder.js b/source/app/web/statics/embed/app.placeholder.js
index 7bb35ab140c..16523022172 100644
--- a/source/app/web/statics/embed/app.placeholder.js
+++ b/source/app/web/statics/embed/app.placeholder.js
@@ -76,23 +76,23 @@
       base: set.plugins.enabled.base,
       //Computed elements
       computed: {
-        commits: faker.datatype.number(10000),
-        sponsorships: faker.datatype.number(10),
+        commits: faker.number.int(10000),
+        sponsorships: faker.number.int(10),
         licenses: {favorite: [""], used: {MIT: 1}, about: {}},
         token: {scopes: []},
         repositories: {
-          watchers: faker.datatype.number(1000),
-          stargazers: faker.datatype.number(10000),
-          issues_open: faker.datatype.number(1000),
-          issues_closed: faker.datatype.number(1000),
-          pr_open: faker.datatype.number(1000),
-          pr_closed: {totalCount: faker.datatype.number(100)},
-          pr_merged: faker.datatype.number(1000),
-          forks: faker.datatype.number(1000),
-          releases: faker.datatype.number(1000),
+          watchers: faker.number.int(1000),
+          stargazers: faker.number.int(10000),
+          issues_open: faker.number.int(1000),
+          issues_closed: faker.number.int(1000),
+          pr_open: faker.number.int(1000),
+          pr_closed: {totalCount: faker.number.int(100)},
+          pr_merged: faker.number.int(1000),
+          forks: faker.number.int(1000),
+          releases: faker.number.int(1000),
         },
         diskUsage: `${faker.datatype.float({min: 1, max: 999}).toFixed(1)}MB`,
-        registration: `${faker.datatype.number({min: 2, max: 10})} years ago`,
+        registration: `${faker.number.int({min: 2, max: 10})} years ago`,
         cakeday: false,
         calendar: new Array(14).fill(null).map(_ => ({color: faker.helpers.arrayElement(["#ebedf0", "#9be9a8", "#40c463", "#30a14e", "#216e39"])})),
         avatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
@@ -100,34 +100,34 @@
       //User data
       account: "user",
       user: {
-        databaseId: faker.datatype.number(10000000),
+        databaseId: faker.number.int(10000000),
         name: "(placeholder)",
         login: set.user || "metrics",
-        createdAt: `${faker.date.past(10)}`,
+        createdAt: `${faker.date.past({ years:10})}`,
         avatarUrl: set.avatar,
         websiteUrl: options["pagespeed.url"] || "(attached website)",
         isHireable: options["base.hireable"],
         twitterUsername: options["tweets.user"] || "(attached Twitter account)",
-        repositories: {totalCount: faker.datatype.number(100), totalDiskUsage: faker.datatype.number(100000), nodes: []},
-        packages: {totalCount: faker.datatype.number(10)},
-        starredRepositories: {totalCount: faker.datatype.number(1000)},
-        watching: {totalCount: faker.datatype.number(100)},
-        sponsorshipsAsSponsor: {totalCount: faker.datatype.number(10)},
-        sponsorshipsAsMaintainer: {totalCount: faker.datatype.number(10)},
+        repositories: {totalCount: faker.number.int(100), totalDiskUsage: faker.number.int(100000), nodes: []},
+        packages: {totalCount: faker.number.int(10)},
+        starredRepositories: {totalCount: faker.number.int(1000)},
+        watching: {totalCount: faker.number.int(100)},
+        sponsorshipsAsSponsor: {totalCount: faker.number.int(10)},
+        sponsorshipsAsMaintainer: {totalCount: faker.number.int(10)},
         contributionsCollection: {
-          totalRepositoriesWithContributedCommits: faker.datatype.number(100),
-          totalCommitContributions: faker.datatype.number(10000),
-          restrictedContributionsCount: faker.datatype.number(10000),
-          totalIssueContributions: faker.datatype.number(100),
-          totalPullRequestContributions: faker.datatype.number(1000),
-          totalPullRequestReviewContributions: faker.datatype.number(1000),
+          totalRepositoriesWithContributedCommits: faker.number.int(100),
+          totalCommitContributions: faker.number.int(10000),
+          restrictedContributionsCount: faker.number.int(10000),
+          totalIssueContributions: faker.number.int(100),
+          totalPullRequestContributions: faker.number.int(1000),
+          totalPullRequestReviewContributions: faker.number.int(1000),
         },
         calendar: {contributionCalendar: {weeks: []}},
-        repositoriesContributedTo: {totalCount: faker.datatype.number(100)},
-        followers: {totalCount: faker.datatype.number(1000)},
-        following: {totalCount: faker.datatype.number(1000)},
-        issueComments: {totalCount: faker.datatype.number(1000)},
-        organizations: {totalCount: faker.datatype.number(10)},
+        repositoriesContributedTo: {totalCount: faker.number.int(100)},
+        followers: {totalCount: faker.number.int(1000)},
+        following: {totalCount: faker.number.int(1000)},
+        issueComments: {totalCount: faker.number.int(1000)},
+        organizations: {totalCount: faker.number.int(10)},
       },
       //Plugins
       plugins: {
@@ -137,16 +137,16 @@
             tweets: {
               username: options["tweets.user"] || "(attached Twitter account)",
               profile: {
-                profile_image_url: faker.image.people(),
+                profile_image_url: faker.image.urlLoremFlickr({ category: 'people' }),
                 name: "",
                 verified: false,
-                id: faker.datatype.number(1000000).toString(),
+                id: faker.number.int(1000000).toString(),
                 username: options["tweets.user"] || "(attached Twitter account)",
                 profile_image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
               },
               list: [
                 {
-                  id: faker.datatype.number(100000000000000).toString(),
+                  id: faker.number.int(100000000000000).toString(),
                   created_at: faker.date.recent(),
                   entities: {
                     mentions: [{start: 22, end: 33, username: "lowlighter"}],
@@ -155,7 +155,7 @@
                   mentions: ["lowlighter"],
                 },
                 ...new Array(Number(options["tweets.limit"]) - 1).fill(null).map(_ => ({
-                  id: faker.datatype.number(100000000000000).toString(),
+                  id: faker.number.int(100000000000000).toString(),
                   created_at: faker.date.recent(),
                   text: faker.lorem.paragraph(),
                   mentions: [],
@@ -168,15 +168,15 @@
         ...(set.plugins.enabled.lines
           ? ({
             lines: {
-              added: faker.datatype.number(1000000),
-              deleted: faker.datatype.number(1000000),
-              changed: faker.datatype.number(1000000),
+              added: faker.number.int(1000000),
+              deleted: faker.number.int(1000000),
+              changed: faker.number.int(1000000),
               sections: options["lines.sections"].split(",").map(x => x.trim()),
               repos: new Array(options["lines.repositories.limit"] || 4).fill(null).map(_ => ({
-                handle: `${faker.random.word()}/${faker.random.word()}`,
-                added: faker.datatype.number(10000),
-                deleted: faker.datatype.number(10000),
-                changed: faker.datatype.number(10000),
+                handle: `${faker.lorem.word()}/${faker.lorem.word()}`,
+                added: faker.number.int(10000),
+                deleted: faker.number.int(10000),
+                changed: faker.number.int(10000),
               })),
               history: await staticPlaceholder(set.plugins.enabled.lines, "lines.history.svg"),
             },
@@ -187,8 +187,8 @@
           ? ({
             traffic: {
               views: {
-                count: `${faker.datatype.number({min: 10, max: 100})}.${faker.datatype.number(9)}k`,
-                uniques: `${faker.datatype.number(10)}.${faker.datatype.number(9)}k`,
+                count: `${faker.number.int({min: 10, max: 100})}.${faker.number.int(9)}k`,
+                uniques: `${faker.number.int(10)}.${faker.number.int(9)}k`,
               },
             },
           })
@@ -202,16 +202,16 @@
                 get count() {
                   return this.open + this.closed + this.drafts + this.skipped
                 },
-                open: faker.datatype.number(1000),
-                closed: faker.datatype.number(1000),
-                drafts: faker.datatype.number(100),
-                skipped: faker.datatype.number(100),
+                open: faker.number.int(1000),
+                closed: faker.number.int(1000),
+                drafts: faker.number.int(100),
+                skipped: faker.number.int(100),
                 get collaborators() {
                   return {
-                    open: faker.datatype.number(this.open),
-                    closed: faker.datatype.number(this.closed),
-                    drafts: faker.datatype.number(this.drafts),
-                    skipped: faker.datatype.number(this.skipped),
+                    open: faker.number.int(this.open),
+                    closed: faker.number.int(this.closed),
+                    drafts: faker.number.int(this.drafts),
+                    skipped: faker.number.int(this.skipped),
                   }
                 },
               },
@@ -219,16 +219,16 @@
                 get count() {
                   return this.open + this.closed + this.merged + this.drafts
                 },
-                open: faker.datatype.number(1000),
-                closed: faker.datatype.number(1000),
-                merged: faker.datatype.number(1000),
-                drafts: faker.datatype.number(100),
+                open: faker.number.int(1000),
+                closed: faker.number.int(1000),
+                merged: faker.number.int(1000),
+                drafts: faker.number.int(100),
                 get collaborators() {
                   return {
-                    open: faker.datatype.number(this.open),
-                    closed: faker.datatype.number(this.closed),
-                    merged: faker.datatype.number(this.skipped),
-                    drafts: faker.datatype.number(this.drafts),
+                    open: faker.number.int(this.open),
+                    closed: faker.number.int(this.closed),
+                    merged: faker.number.int(this.skipped),
+                    drafts: faker.number.int(this.drafts),
                   }
                 },
               },
@@ -237,19 +237,19 @@
                   get count() {
                     return this.open + this.closed + this.drafts + this.skipped
                   },
-                  open: faker.datatype.number(1000),
-                  closed: faker.datatype.number(1000),
-                  drafts: faker.datatype.number(100),
-                  skipped: faker.datatype.number(100),
+                  open: faker.number.int(1000),
+                  closed: faker.number.int(1000),
+                  drafts: faker.number.int(100),
+                  skipped: faker.number.int(100),
                 },
                 pr: {
                   get count() {
                     return this.open + this.closed + this.merged + this.drafts
                   },
-                  open: faker.datatype.number(1000),
-                  closed: faker.datatype.number(1000),
-                  merged: faker.datatype.number(1000),
-                  drafts: faker.datatype.number(100),
+                  open: faker.number.int(1000),
+                  closed: faker.number.int(1000),
+                  merged: faker.number.int(1000),
+                  drafts: faker.number.int(100),
                 },
               },
               indepth: options["followup.indepth"] ? {} : null,
@@ -260,23 +260,23 @@
         ...(set.plugins.enabled.notable
           ? ({
             notable: {
-              contributions: new Array(2 + faker.datatype.number(2)).fill(null).map(_ => ({
+              contributions: new Array(2 + faker.number.int(2)).fill(null).map(_ => ({
                 get name() {
                   return options["notable.repositories"] ? this.handle : this.handle.split("/")[0]
                 },
                 handle: `${faker.lorem.slug()}/${faker.lorem.slug()}`,
                 avatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
                 organization: faker.datatype.boolean(),
-                stars: faker.datatype.number(1000),
-                aggregated: faker.datatype.number(100),
-                history: faker.datatype.number(1000),
+                stars: faker.number.int(1000),
+                aggregated: faker.number.int(100),
+                history: faker.number.int(1000),
                 ...(options["notable.indepth"]
                   ? {
                     user: {
-                      commits: faker.datatype.number(100),
+                      commits: faker.number.int(100),
                       percentage: faker.datatype.float({max: 1}),
                       maintainer: false,
-                      stars: faker.datatype.number(100),
+                      stars: faker.number.int(100),
                     },
                   }
                   : null),
@@ -288,11 +288,11 @@
         ...(set.plugins.enabled.gists
           ? ({
             gists: {
-              totalCount: faker.datatype.number(100),
-              stargazers: faker.datatype.number(1000),
-              forks: faker.datatype.number(100),
-              files: faker.datatype.number(100),
-              comments: faker.datatype.number(1000),
+              totalCount: faker.number.int(100),
+              stargazers: faker.number.int(1000),
+              forks: faker.number.int(100),
+              files: faker.number.int(100),
+              comments: faker.number.int(1000),
             },
           })
           : null),
@@ -302,60 +302,60 @@
             reactions: {
               list: {
                 HEART: {
-                  value: faker.datatype.number(100),
+                  value: faker.number.int(100),
                   get percentage() {
                     return this.score
                   },
-                  score: faker.datatype.number(100) / 100,
+                  score: faker.number.int(100) / 100,
                 },
                 THUMBS_UP: {
-                  value: faker.datatype.number(100),
+                  value: faker.number.int(100),
                   get percentage() {
                     return this.score
                   },
-                  score: faker.datatype.number(100) / 100,
+                  score: faker.number.int(100) / 100,
                 },
                 THUMBS_DOWN: {
-                  value: faker.datatype.number(100),
+                  value: faker.number.int(100),
                   get percentage() {
                     return this.score
                   },
-                  score: faker.datatype.number(100) / 100,
+                  score: faker.number.int(100) / 100,
                 },
                 LAUGH: {
-                  value: faker.datatype.number(100),
+                  value: faker.number.int(100),
                   get percentage() {
                     return this.score
                   },
-                  score: faker.datatype.number(100) / 100,
+                  score: faker.number.int(100) / 100,
                 },
                 CONFUSED: {
-                  value: faker.datatype.number(100),
+                  value: faker.number.int(100),
                   get percentage() {
                     return this.score
                   },
-                  score: faker.datatype.number(100) / 100,
+                  score: faker.number.int(100) / 100,
                 },
                 EYES: {
-                  value: faker.datatype.number(100),
+                  value: faker.number.int(100),
                   get percentage() {
                     return this.score
                   },
-                  score: faker.datatype.number(100) / 100,
+                  score: faker.number.int(100) / 100,
                 },
                 ROCKET: {
-                  value: faker.datatype.number(100),
+                  value: faker.number.int(100),
                   get percentage() {
                     return this.score
                   },
-                  score: faker.datatype.number(100) / 100,
+                  score: faker.number.int(100) / 100,
                 },
                 HOORAY: {
-                  value: faker.datatype.number(100),
+                  value: faker.number.int(100),
                   get percentage() {
                     return this.score
                   },
-                  score: faker.datatype.number(100) / 100,
+                  score: faker.number.int(100) / 100,
                 },
               },
               comments: options["reactions.limit"],
@@ -381,8 +381,8 @@
                     .replace(/#secondary/g, colors[this.rank][1])
                 },
                 rank: faker.helpers.arrayElement(["A", "B", "C", "X", "$"]),
-                progress: faker.datatype.number(100) / 100,
-                value: faker.datatype.number(1000),
+                progress: faker.number.int(100) / 100,
+                value: faker.number.int(1000),
               }))
                 .filter(({rank}) => options["achievements.secrets"] ? true : rank !== "$")
                 .filter(({rank}) => ({S: 5, A: 4, B: 3, C: 2, $: 1, X: 0}[rank] >= {S: 5, A: 4, B: 3, C: 2, $: 1, X: 0}[options["achievements.threshold"]]))
@@ -410,10 +410,10 @@
                 message: faker.lorem.sentence(),
                 filename: "docs/specifications.html",
                 status: "modified",
-                additions: faker.datatype.number(50),
-                deletions: faker.datatype.number(50),
+                additions: faker.number.int(50),
+                deletions: faker.number.int(50),
                 patch: `<span class="token coord">@@ -0,0 +1,5 @@</span><br>  //Imports<br><span class="token inserted">+  import app from "./src/app.mjs"</span><br><span class="token deleted">-  import app from "./src/app.js"</span><br>  //Start app<br>  await app()<br>\\ No newline at end of file`,
-                repo: `${faker.random.word()}/${faker.random.word()}`,
+                repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                 created: faker.date.recent(),
               },
             },
@@ -425,9 +425,9 @@
             sponsors: {
               sections: options["sponsors.sections"].split(",").map(x => x.trim()),
               about: "A new way to contribute to open source",
-              list: new Array(Number(faker.datatype.number(40))).fill(null).map(_ => ({
+              list: new Array(Number(faker.number.int(40))).fill(null).map(_ => ({
                 login: faker.internet.userName(),
-                amount: faker.datatype.number(10),
+                amount: faker.number.int(10),
                 avatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
                 past: faker.datatype.boolean(),
               })),
@@ -435,24 +435,24 @@
               size: options["sponsors.size"],
               count: {
                 total: {
-                  count: faker.datatype.number(100),
-                  user: faker.datatype.number(100),
-                  organization: faker.datatype.number(100),
+                  count: faker.number.int(100),
+                  user: faker.number.int(100),
+                  organization: faker.number.int(100),
                 },
                 active: {
-                  total: faker.datatype.number(100),
-                  user: faker.datatype.number(100),
-                  organization: faker.datatype.number(100),
+                  total: faker.number.int(100),
+                  user: faker.number.int(100),
+                  organization: faker.number.int(100),
                 },
                 past: {
-                  total: faker.datatype.number(100),
-                  user: faker.datatype.number(100),
-                  organization: faker.datatype.number(100),
+                  total: faker.number.int(100),
+                  user: faker.number.int(100),
+                  organization: faker.number.int(100),
                 },
               },
               goal: {
-                progress: faker.datatype.number(100),
-                title: `$${faker.datatype.number(100) * 10} per month`,
+                progress: faker.number.int(100),
+                title: `$${faker.number.int(100) * 10} per month`,
                 description: "Invest in the software that powers your world",
               },
             },
@@ -463,12 +463,12 @@
           ? ({
             sponsorships: {
               sections: options["sponsorships.sections"].split(",").map(x => x.trim()),
-              amount: faker.datatype.number(1000),
-              list: new Array(2 + faker.datatype.number(8)).fill(null).map(_ => ({
+              amount: faker.number.int(1000),
+              list: new Array(2 + faker.number.int(8)).fill(null).map(_ => ({
                 login: faker.internet.userName(),
                 avatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
                 type: "user",
-                tier: `$${faker.datatype.number(100) * 10} per month`,
+                tier: `$${faker.number.int(100) * 10} per month`,
                 private: false,
                 past: faker.datatype.boolean(),
               })),
@@ -482,36 +482,36 @@
         ...(set.plugins.enabled.languages
           ? ({
             languages: {
-              unique: faker.datatype.number(50),
+              unique: faker.number.int(50),
               sections: options["languages.sections"].split(", ").map(x => x.trim()).filter(x => /^(most-used|recently-used)$/.test(x)),
               details: options["languages.details"].split(",").map(x => x.trim()).filter(x => x),
               get colors() {
                 return Object.fromEntries(Object.entries(this.favorites).map(([key, {color}]) => [key, color]))
               },
-              total: faker.datatype.number(10000),
+              total: faker.number.int(10000),
               get stats() {
                 return Object.fromEntries(Object.entries(this.favorites).map(([key, {value}]) => [key, value]))
               },
               ["stats.recent"]: {
-                total: faker.datatype.number(10000),
+                total: faker.number.int(10000),
                 get lines() {
                   return Object.fromEntries(Object.entries(this.recent).map(([key, {value}]) => [key, value]))
                 },
                 get stats() {
                   return Object.fromEntries(Object.entries(this.recent).map(([key, {value}]) => [key, value]))
                 },
-                commits: faker.datatype.number(500),
-                files: faker.datatype.number(1000),
+                commits: faker.number.int(500),
+                files: faker.number.int(1000),
                 days: Number(options["languages.recent.days"]),
               },
-              favorites: distribution(options["languages.limit"] || 8).map((value, index, array) => ({name: (index + 1 === array.length) && (options["languages.other"]) ? "Other" : faker.lorem.word(), color: faker.internet.color(), value, size: faker.datatype.number(1000000), x: array.slice(0, index).reduce((a, b) => a + b, 0)})),
-              recent: distribution(options["languages.limit"] || 8).map((value, index, array) => ({name: (index + 1 === array.length) && (options["languages.other"]) ? "Other" : faker.lorem.word(), color: faker.internet.color(), value, size: faker.datatype.number(1000000), x: array.slice(0, index).reduce((a, b) => a + b, 0)})),
+              favorites: distribution(options["languages.limit"] || 8).map((value, index, array) => ({name: (index + 1 === array.length) && (options["languages.other"]) ? "Other" : faker.lorem.word(), color: faker.internet.color(), value, size: faker.number.int(1000000), x: array.slice(0, index).reduce((a, b) => a + b, 0)})),
+              recent: distribution(options["languages.limit"] || 8).map((value, index, array) => ({name: (index + 1 === array.length) && (options["languages.other"]) ? "Other" : faker.lorem.word(), color: faker.internet.color(), value, size: faker.number.int(1000000), x: array.slice(0, index).reduce((a, b) => a + b, 0)})),
               get verified() {
-                return options["languages.indepth"] ? {signature: faker.datatype.number(this.commits)} : null
+                return options["languages.indepth"] ? {signature: faker.number.int(this.commits)} : null
               },
               indepth: options["languages.indepth"],
-              commits: faker.datatype.number(500),
-              files: faker.datatype.number(1000),
+              commits: faker.number.int(500),
+              files: faker.number.int(1000),
             },
           })
           : null),
@@ -535,8 +535,8 @@
             stock: {
               chart: await staticPlaceholder(set.plugins.enabled.stock, "stock.svg"),
               currency: "USD",
-              price: faker.datatype.number(10000) / 100,
-              previous: faker.datatype.number(10000) / 100,
+              price: faker.number.int(10000) / 100,
+              previous: faker.number.int(10000) / 100,
               get delta() {
                 return this.price - this.previous
               },
@@ -556,7 +556,7 @@
               trim: options["habits.trim"],
               lines: {
                 average: {
-                  chars: faker.datatype.number(1000) / 10,
+                  chars: faker.number.int(1000) / 10,
                 },
               },
               commits: {
@@ -564,13 +564,13 @@
                   return Object.keys(this.hours).filter(key => /^\d+$/.test(key)).map(key => [key, this.hours[key]]).sort((a, b) => b[1] - a[1]).shift()?.[0]
                 },
                 hours: {
-                  [faker.datatype.number(24)]: faker.datatype.number(10),
-                  [faker.datatype.number(24)]: faker.datatype.number(10),
-                  [faker.datatype.number(24)]: faker.datatype.number(10),
-                  [faker.datatype.number(24)]: faker.datatype.number(10),
-                  [faker.datatype.number(24)]: faker.datatype.number(10),
-                  [faker.datatype.number(24)]: faker.datatype.number(10),
-                  [faker.datatype.number(24)]: faker.datatype.number(10),
+                  [faker.number.int(24)]: faker.number.int(10),
+                  [faker.number.int(24)]: faker.number.int(10),
+                  [faker.number.int(24)]: faker.number.int(10),
+                  [faker.number.int(24)]: faker.number.int(10),
+                  [faker.number.int(24)]: faker.number.int(10),
+                  [faker.number.int(24)]: faker.number.int(10),
+                  [faker.number.int(24)]: faker.number.int(10),
                   get max() {
                     return Object.keys(this).filter(key => /^\d+$/.test(key)).map(key => [key, this[key]]).sort((a, b) => b[1] - a[1]).shift()?.[1]
                   },
@@ -579,13 +579,13 @@
                   return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][Object.keys(this.days).filter(key => /^\d+$/.test(key)).map(key => [key, this.days[key]]).sort((a, b) => b[1] - a[1]).shift()?.[0]]
                 },
                 days: {
-                  "0": faker.datatype.number(10),
-                  "1": faker.datatype.number(10),
-                  "2": faker.datatype.number(10),
-                  "3": faker.datatype.number(10),
-                  "4": faker.datatype.number(10),
-                  "5": faker.datatype.number(10),
-                  "6": faker.datatype.number(10),
+                  "0": faker.number.int(10),
+                  "1": faker.number.int(10),
+                  "2": faker.number.int(10),
+                  "3": faker.number.int(10),
+                  "4": faker.number.int(10),
+                  "5": faker.number.int(10),
+                  "6": faker.number.int(10),
                   get max() {
                     return Object.keys(this).filter(key => /^\d+$/.test(key)).map(key => [key, this[key]]).sort((a, b) => b[1] - a[1]).shift()?.[1]
                   },
@@ -637,8 +637,8 @@
               mode: "Suggested tracks",
               played_at: options["music.played.at"],
               tracks: new Array(Number(options["music.limit"])).fill(null).map(_ => ({
-                name: faker.random.words(5),
-                artist: faker.random.words(),
+                name: faker.lorem.words(5),
+                artist: faker.lorem.words(),
                 artwork: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
                 played_at: options["music.played.at"] ? faker.date.recent() : null,
               })),
@@ -653,8 +653,8 @@
               data: new Array(12).fill(null).map(_ => ({
                 timeUTCHumanReadable: `${new Date().getUTCHours()}:${new Date().getUTCMinutes()}`,
                 color: faker.helpers.arrayElement(["#9be9a8", "#40c463", "#30a14e", "#216e39"]),
-                sgv: faker.datatype.number({min: 40, max: 400}),
-                delta: faker.datatype.number({min: -10, max: 10}),
+                sgv: faker.number.int({min: 40, max: 400}),
+                delta: faker.number.int({min: -10, max: 10}),
                 direction: faker.helpers.arrayElement(["SingleUp", "DoubleUp", "FortyFiveUp", "Flat", "FortyFiveDown", "SingleDown", "DoubleDown"]),
                 alert: faker.helpers.arrayElement(["Normal", "Urgent High", "Urgent Low", "High", "Low"]),
                 arrowHumanReadable: faker.helpers.arrayElement(["↑↑", "↑", "↗", "→", "↘", "↓", "↓↓"]),
@@ -683,43 +683,43 @@
                 {score: faker.datatype.float({max: 1}), title: "Accessibility"},
                 {score: faker.datatype.float({max: 1}), title: "Best Practices"},
                 {score: faker.datatype.float({max: 1}), title: "SEO"},
-                ...options["pagespeed.pwa"] ? [{score: faker.datatype.number({max: 1}), title: "PWA"}] : [],
+                ...options["pagespeed.pwa"] ? [{score: faker.number.int({max: 1}), title: "PWA"}] : [],
               ],
               metrics: {
-                observedFirstContentfulPaint: faker.datatype.number(500),
+                observedFirstContentfulPaint: faker.number.int(500),
                 observedFirstVisualChangeTs: faker.date.recent(),
                 observedFirstContentfulPaintTs: faker.date.recent(),
-                firstContentfulPaint: faker.datatype.number(500),
-                observedDomContentLoaded: faker.datatype.number(500),
-                observedFirstMeaningfulPaint: faker.datatype.number(1000),
-                maxPotentialFID: faker.datatype.number(500),
-                observedLoad: faker.datatype.number(500),
-                firstMeaningfulPaint: faker.datatype.number(500),
+                firstContentfulPaint: faker.number.int(500),
+                observedDomContentLoaded: faker.number.int(500),
+                observedFirstMeaningfulPaint: faker.number.int(1000),
+                maxPotentialFID: faker.number.int(500),
+                observedLoad: faker.number.int(500),
+                firstMeaningfulPaint: faker.number.int(500),
                 observedCumulativeLayoutShift: faker.datatype.float({max: 1}),
-                observedSpeedIndex: faker.datatype.number(1000),
+                observedSpeedIndex: faker.number.int(1000),
                 observedSpeedIndexTs: faker.date.recent(),
                 observedTimeOriginTs: faker.date.recent(),
-                observedLargestContentfulPaint: faker.datatype.number(1000),
+                observedLargestContentfulPaint: faker.number.int(1000),
                 cumulativeLayoutShift: faker.datatype.float({max: 1}),
                 observedFirstPaintTs: faker.date.recent(),
                 observedTraceEndTs: faker.date.recent(),
-                largestContentfulPaint: faker.datatype.number(2000),
-                observedTimeOrigin: faker.datatype.number(10),
-                speedIndex: faker.datatype.number(1000),
-                observedTraceEnd: faker.datatype.number(2000),
+                largestContentfulPaint: faker.number.int(2000),
+                observedTimeOrigin: faker.number.int(10),
+                speedIndex: faker.number.int(1000),
+                observedTraceEnd: faker.number.int(2000),
                 observedDomContentLoadedTs: faker.date.recent(),
-                observedFirstPaint: faker.datatype.number(500),
-                totalBlockingTime: faker.datatype.number(500),
+                observedFirstPaint: faker.number.int(500),
+                totalBlockingTime: faker.number.int(500),
                 observedLastVisualChangeTs: faker.date.recent(),
-                observedFirstVisualChange: faker.datatype.number(500),
+                observedFirstVisualChange: faker.number.int(500),
                 observedLargestContentfulPaintTs: faker.date.recent(),
-                estimatedInputLatency: faker.datatype.number(100),
+                estimatedInputLatency: faker.number.int(100),
                 observedLoadTs: faker.date.recent(),
-                observedLastVisualChange: faker.datatype.number(1000),
-                firstCPUIdle: faker.datatype.number(1000),
-                interactive: faker.datatype.number(1000),
+                observedLastVisualChange: faker.number.int(1000),
+                firstCPUIdle: faker.number.int(1000),
+                interactive: faker.number.int(1000),
                 observedNavigationStartTs: faker.date.recent(),
-                observedNavigationStart: faker.datatype.number(10),
+                observedNavigationStart: faker.number.int(10),
                 observedFirstMeaningfulPaintTs: faker.date.recent(),
               },
               screenshot: options["pagespeed.screenshot"] ? "data:image/jpg;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==" : null,
@@ -730,29 +730,29 @@
         ...(set.plugins.enabled.projects
           ? ({
             projects: {
-              totalCount: options["projects.limit"] + faker.datatype.number(10),
+              totalCount: options["projects.limit"] + faker.number.int(10),
               descriptions: options["projects.descriptions"],
               list: new Array(Number(options["projects.limit"])).fill(null).map(_ => ({
                 name: faker.lorem.sentence(),
                 description: faker.lorem.paragraph(),
-                updated: `${2 + faker.datatype.number(8)} days ago`,
+                updated: `${2 + faker.number.int(8)} days ago`,
                 ...(faker.datatype.boolean()
                   ? {
-                    items: new Array(faker.datatype.number(4)).fill(null).map(() => ({type: faker.helpers.arrayElement(["DRAFT_ISSUE", "ISSUE", "PULL_REQUEST", "REDACTED"]), text: faker.lorem.sentence()})),
+                    items: new Array(faker.number.int(4)).fill(null).map(() => ({type: faker.helpers.arrayElement(["DRAFT_ISSUE", "ISSUE", "PULL_REQUEST", "REDACTED"]), text: faker.lorem.sentence()})),
                     progress: {
                       enabled: false,
                       todo: NaN,
                       doing: NaN,
                       done: NaN,
-                      total: faker.datatype.number(100),
+                      total: faker.number.int(100),
                     },
                   }
                   : {
                     progress: {
                       enabled: true,
-                      todo: faker.datatype.number(50),
-                      doing: faker.datatype.number(50),
-                      done: faker.datatype.number(50),
+                      todo: faker.number.int(50),
+                      doing: faker.number.int(50),
+                      done: faker.number.int(50),
                       get total() {
                         return this.todo + this.doing + this.done
                       },
@@ -767,13 +767,13 @@
           ? ({
             discussions: {
               categories: {
-                stats: {"🙏 Q&A": faker.datatype.number(100), "📣 Announcements": faker.datatype.number(100), "💡 Ideas": faker.datatype.number(100), "💬 General": faker.datatype.number(100)},
+                stats: {"🙏 Q&A": faker.number.int(100), "📣 Announcements": faker.number.int(100), "💡 Ideas": faker.number.int(100), "💬 General": faker.number.int(100)},
                 favorite: "📣 Announcements",
               },
-              upvotes: {discussions: faker.datatype.number(1000), comments: faker.datatype.number(1000)},
-              started: faker.datatype.number(1000),
-              comments: faker.datatype.number(1000),
-              answers: faker.datatype.number(1000),
+              upvotes: {discussions: faker.number.int(1000), comments: faker.number.int(1000)},
+              started: faker.number.int(1000),
+              comments: faker.number.int(1000),
+              answers: faker.number.int(1000),
               display: {categories: options["discussions.categories"] ? {limit: options["discussions.categories.limit"] || Infinity} : null},
             },
           })
@@ -817,17 +817,17 @@
                   starredAt: faker.date.recent(),
                   node: {
                     description: "📊 An image generator with 20+ metrics about your GitHub account such as activity, community, repositories, coding habits, website performances, music played, starred topics, etc. that you can put on your profile or elsewhere !",
-                    forkCount: faker.datatype.number(100),
+                    forkCount: faker.number.int(100),
                     isFork: false,
                     issues: {
-                      totalCount: faker.datatype.number(100),
+                      totalCount: faker.number.int(100),
                     },
                     nameWithOwner: "lowlighter/metrics",
                     openGraphImageUrl: "https://repository-images.githubusercontent.com/293860197/7fd72080-496d-11eb-8fe0-238b38a0746a",
                     pullRequests: {
-                      totalCount: faker.datatype.number(100),
+                      totalCount: faker.number.int(100),
                     },
-                    stargazerCount: faker.datatype.number(10000),
+                    stargazerCount: faker.number.int(10000),
                     licenseInfo: {nickname: null, name: "MIT License"},
                     primaryLanguage: {color: "#f1e05a", name: "JavaScript"},
                   },
@@ -837,17 +837,17 @@
                   starredAt: faker.date.recent(),
                   node: {
                     description: faker.lorem.sentence(),
-                    forkCount: faker.datatype.number(100),
+                    forkCount: faker.number.int(100),
                     isFork: faker.datatype.boolean(),
                     issues: {
-                      totalCount: faker.datatype.number(100),
+                      totalCount: faker.number.int(100),
                     },
-                    nameWithOwner: `${faker.random.word()}/${faker.random.word()}`,
+                    nameWithOwner: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     openGraphImageUrl: faker.internet.url(),
                     pullRequests: {
-                      totalCount: faker.datatype.number(100),
+                      totalCount: faker.number.int(100),
                     },
-                    stargazerCount: faker.datatype.number(10000),
+                    stargazerCount: faker.number.int(10000),
                     licenseInfo: {nickname: null, name: "License"},
                     primaryLanguage: {color: faker.internet.color(), name: faker.lorem.word()},
                   },
@@ -865,12 +865,12 @@
                 link: faker.internet.url(),
                 name: `${faker.helpers.arrayElement(["😎", "🥳", "🧐", "😂", "😁"])} ${faker.lorem.word()}`,
                 description: faker.lorem.sentence(),
-                count: faker.datatype.number(100),
+                count: faker.number.int(100),
                 repositories: new Array(Number(options["starlists.limit.repositories"])).fill(null).map((_, i) => ({
                   description: !i
                     ? "📊 An image generator with 20+ metrics about your GitHub account such as activity, community, repositories, coding habits, website performances, music played, starred topics, etc. that you can put on your profile or elsewhere !"
                     : faker.lorem.sentence(),
-                  name: !i ? "lowlighter/metrics" : `${faker.random.word()}/${faker.random.word()}`,
+                  name: !i ? "lowlighter/metrics" : `${faker.lorem.word()}/${faker.lorem.word()}`,
                 })),
               })),
             },
@@ -881,19 +881,19 @@
           ? ({
             repositories: {
               list: new Array(Number(options["repositories.featured"].split(",").map(x => x.trim()).length)).fill(null).map((_, i) => ({
-                created: faker.date.past(),
+                created: (),
                 description: faker.lorem.sentence(),
-                forkCount: faker.datatype.number(100),
+                forkCount: faker.number.int(100),
                 isFork: faker.datatype.boolean(),
                 issues: {
-                  totalCount: faker.datatype.number(100),
+                  totalCount: faker.number.int(100),
                 },
-                nameWithOwner: `${faker.random.word()}/${faker.random.word()}`,
+                nameWithOwner: `${faker.lorem.word()}/${faker.lorem.word()}`,
                 openGraphImageUrl: faker.internet.url(),
                 pullRequests: {
-                  totalCount: faker.datatype.number(100),
+                  totalCount: faker.number.int(100),
                 },
-                stargazerCount: faker.datatype.number(10000),
+                stargazerCount: faker.number.int(10000),
                 licenseInfo: {nickname: null, name: "License"},
                 primaryLanguage: {color: faker.internet.color(), name: faker.lorem.word()},
               })),
@@ -908,7 +908,7 @@
             },
             get stargazers() {
               const dates = []
-              let total = faker.datatype.number(1000)
+              let total = faker.number.int(1000)
               const result = {
                 worldmap: this.__stargazers.worldmap,
                 total: {
@@ -934,7 +934,7 @@
               for (let d = -14; d <= 0; d++) {
                 const date = new Date(Date.now() - d * 24 * 60 * 60 * 1000).toISOString().substring(0, 10)
                 dates.push(date)
-                result.total.dates[date] = total += result.increments.dates[date] = faker.datatype.number(100)
+                result.total.dates[date] = total += result.increments.dates[date] = faker.number.int(100)
               }
               return result
             },
@@ -946,14 +946,14 @@
             get wakatime() {
               const stats = array => {
                 const elements = []
-                let results = new Array(4 + faker.datatype.number(2)).fill(null).map(_ => ({
-                  name: array ? faker.helpers.arrayElement(array) : faker.random.words(2).replace(/ /g, "-").toLocaleLowerCase(),
+                let results = new Array(4 + faker.number.int(2)).fill(null).map(_ => ({
+                  name: array ? faker.helpers.arrayElement(array) : faker.lorem.words(2).replace(/ /g, "-").toLocaleLowerCase(),
                   percent: 0,
-                  total_seconds: faker.datatype.number(1000000),
+                  total_seconds: faker.number.int(1000000),
                 }))
                 let percents = 100
                 for (const result of results) {
-                  result.percent = 1 + faker.datatype.number(percents - 1)
+                  result.percent = 1 + faker.number.int(percents - 1)
                   percents -= result.percent
                   result.percent /= 100
                 }
@@ -963,7 +963,7 @@
               return {
                 sections: options["wakatime.sections"].split(",").map(x => x.trim()).filter(x => x),
                 days: Number(options["wakatime.days"]) || 7,
-                time: {total: faker.datatype.number(100000), daily: faker.datatype.number(24)},
+                time: {total: faker.number.int(100000), daily: faker.number.int(24)},
                 editors: stats(["VS Code", "Chrome", "IntelliJ", "PhpStorm", "WebStorm", "Android Studio", "Visual Studio", "Sublime Text", "PyCharm", "Vim", "Atom", "Xcode"]),
                 languages: stats(["JavaScript", "TypeScript", "PHP", "Java", "Python", "Vue.js", "HTML", "C#", "JSON", "Dart", "SCSS", "Kotlin", "JSX", "Go", "Ruby", "YAML"]),
                 projects: stats(),
@@ -979,15 +979,15 @@
               user: {
                 stats: {
                   anime: {
-                    count: faker.datatype.number(1000),
-                    minutesWatched: faker.datatype.number(100000),
-                    episodesWatched: faker.datatype.number(10000),
+                    count: faker.number.int(1000),
+                    minutesWatched: faker.number.int(100000),
+                    episodesWatched: faker.number.int(10000),
                     genres: new Array(4).fill(null).map(_ => ({genre: faker.lorem.word()})),
                   },
                   manga: {
-                    count: faker.datatype.number(1000),
-                    chaptersRead: faker.datatype.number(100000),
-                    volumesRead: faker.datatype.number(10000),
+                    count: faker.number.int(1000),
+                    chaptersRead: faker.number.int(100000),
+                    volumesRead: faker.number.int(10000),
                     genres: new Array(4).fill(null).map(_ => ({genre: faker.lorem.word()})),
                   },
                 },
@@ -998,12 +998,12 @@
                   name: faker.lorem.words(),
                   type,
                   status: faker.helpers.arrayElement(["FINISHED", "RELEASING", "NOT_YET_RELEASED", "CANCELLED", "HIATUS"]),
-                  release: faker.date.past(20).getFullYear(),
+                  release: faker.date.past({years:20}).getFullYear(),
                   genres: new Array(6).fill(null).map(_ => faker.lorem.word()),
-                  progress: faker.datatype.number(100),
+                  progress: faker.number.int(100),
                   description: faker.lorem.paragraphs(),
-                  scores: {user: faker.datatype.number(100), community: faker.datatype.number(100)},
-                  released: 100 + faker.datatype.number(1000),
+                  scores: {user: faker.number.int(100), community: faker.number.int(100)},
+                  released: 100 + faker.number.int(1000),
                   artwork: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
                 })
                 const sections = options["anilist.sections"].split(",").map(x => x.trim()).filter(x => x)
@@ -1028,7 +1028,7 @@
                 }
               },
               characters: new Array(11).fill(null).map(_ => ({
-                name: faker.name.fullName(),
+                name: faker.person.fullName(),
                 artwork: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
               })),
               sections: options["anilist.sections"].split(",").map(x => x.trim()).filter(x => x),
@@ -1041,14 +1041,14 @@
             steam: {
               sections: options["steam.sections"].split(",").map(x => x.trim()).filter(x => x),
               player: {
-                level: faker.datatype.number(100),
+                level: faker.number.int(100),
                 avatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
-                created: faker.date.recent(10).getTime(),
+                created: faker.date.recent({days:10}).getTime(),
                 name: faker.internet.userName(),
               },
               games: {
                 count: 2,
-                playtime: faker.datatype.number(1000),
+                playtime: faker.number.int(1000),
                 achievements: 0,
                 "most-played": [
                   {
@@ -1056,8 +1056,8 @@
                     name: "NieR:Automata™",
                     icon:
                       "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCABAAEADASIAAhEBAxEB/8QAHAAAAgMBAQEBAAAAAAAAAAAABgcFCAkEAwEA/8QAMBAAAQMDAwEGBQQDAAAAAAAAAQIDBAAFEQYHITESExQiQVEjMkJhcQhSobEVgcH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8ArPebk9cpIW+U8D0FcJUTj39q+Kxnjp6VN6N0zcdV3xi12lpTjzqgCoDIQPc0EKlZ6YJI6Yrvt1oudwIRAhPPqV+1NXb252F01pmHGfuDHjLoPMtazlGfbsmmoxZbXHwI9uhN4/aykH+qDNa5afvNsBE+3vsgj6k1EqKgeRhXTmtQXbTb3jh6BEcT7LZSo/yKXevNktKaqbkOGGIk5acNuMnsJSfwKCgXbUlWfqrpts12DLS8zgqB5yKJNydDXLQl9ct9xQe7J+G5jhQ9KEU/MMUH5XUZOR9qu1+l7Q8fS+jDfLk0lufLyVLWPlb6giqdaYgpueorfDI8rzoSRWhGpbZKe20MK15D6YiEoSnqSAKCMTuzZv8AMeFUy6Ifb7vx2fhAjqKYTD7chpDzCgttYCkqHQikM3fbEnbB6yqhpevThU34NKfi9vI82cUz9EKfs+lILd+eS24oAISRykY4BoC5RwCSQPzS9uu6tmgXZcRCHJEdo4elIPkb980R3iWLvZp8ayS21TO78uOopC27VtqsGjLzpm/2l1m8rU4UhxIKpBUrjBxQMHfPSkDX+3L8yEEPSmGy9GcQOSeOKoU60piQ404PM2opUPYjitDNl7XPg6Ebau6VBTqlLS2vqlB6CqQbsWtFn3AusZsdlJcLmPyTQRGkZibfqq2ynD5Wngo1ou5Pks6et8yE33iCyhS04z5SkVmecpWCnqORV7/0266Z1ZoliHJfQq5RPI40evYHAoCKdqvR0BwyViCLljPd9gBeag7rutF75pk2N98k+TBHP4rx3F2YiX68qvlqfVGuSQMIUSUEj7UAzdtNwo0pl+LLjPOtqzgNelAwY+58W3zA2rT8lhx35jkDipuJrLRV5mI8aICbik5Sh5sKXn84pSx9ttwrhOW7cJUdBUAAe66Ue6G2WhWq6ovF+f8AG3JGCgtkpQD9x60DMtEp+WHHFoCI2MN4GOKz73lnouW410eRyAstjHuCauzvNrGLonQ81/vEty3GyiMgcEqrPSXJXMmyJLxy68srJ+5OaDxX81EOhNWXHR1/YudsdUlTagVIB4UPYioi4wZEJ/upCCleM1yhJ59KC/8AtzvRpnV8NhLstuFcSACw6rlSvXFM5JT84UCFDg54rLZpx1hxLsdS2lJ6KScEf7ootm4OqbatCmLvJV2eneOFQ/ug0jzzyefzQDr3dfTOjWHRMnNPTUDiM2rzVR27bjaruR7Ui7SEk8ZbWU/9oXlyZEt0uS3nH3T9S1FR/mgLd0df3LXl9cmTVqEYKIaazwkenFBaeo9K+dk56V7w4zsqQGWkFS1dAKD/2Q==",
-                    playtime: faker.datatype.number(100),
-                    played: faker.date.recent(10).getTime(),
+                    playtime: faker.number.int(100),
+                    played: faker.date.recent({days:10}).getTime(),
                     description: "NieR: Automata tells the story of androids 2B, 9S and A2 and their battle to reclaim the machine-driven dystopia overrun by powerful machines.",
                     genres: [
                       "Action",
@@ -1068,7 +1068,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUGBwP/xAAmEAABAgQDCQAAAAAAAAAAAAABAAIDBAUGBxIUFiMxNVNhc5Gx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAME/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A6XVcM5QqlppTK+G4GJvSXEEngOyT7d1TpwPRRiVz5niH0qTWNVWbd1TpwPRTi1bhnK7UtNN5WQ2gRN0S0kg8D2Wdqsw158/xH6EBiVz5niH0qTWiXVb05XalqZTKyG0GHvQWkkHiOyT7CVTqQPZQSarMNefP8R+hGwlU6kD2U4tW3pyhVLUzeV8NwEPdAuIJPE9kH//Z",
                         achieved: true,
-                        unlocked: faker.date.recent(10).getTime(),
+                        unlocked: faker.date.recent({days:10}).getTime(),
                         name: "Transcendent Being",
                         description: "",
                         id: "ACH_BAD_END",
@@ -1077,7 +1077,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAABQQDAAL/xAAtEAABAwMCBAQGAwAAAAAAAAABAgMEAAURBiISITFBExQjMlFhcYGRsRXB0f/EABcBAQEBAQAAAAAAAAAAAAAAAAABAwT/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwC3UF7lWeeY8bc2rLnqKJIJPT6VhE1BdpCgAhtORy2qJ/ArxqprxtRIB7IH7pixMJZfZWOQPEB+DXG1FSL/AHhj3soB64IINU6evMm8TvLytqEYX6aikkg9D8vlSmomEPcK8hWEYIznuaE0uz4N/cx3R/dQdqdt3+cDkfgUtLZ2LOAr4DPaqbOiDeZrcW4w5cd2Mkq3HiQVBW4Ajl7eX3OOlb3W2yLjMMiPxJSklO9JByDjP0q+2tzIiAlyO27j4k1QfdotvsD7zjEOa9Hkoy64yBhrh6de2P1U2mXmpN2W8wh5Dakjh8UYKh3OKcuKZUpspbitNkjBOT/tHWu3yLfN8xJClpWQnYkqIyeX2oP/2Q==",
                         achieved: true,
-                        unlocked: faker.date.recent(10).getTime(),
+                        unlocked: faker.date.recent({days:10}).getTime(),
                         name: "A Round by the Pond",
                         description: "20 different kinds of fish caught.",
                         id: "ACH_FISHING",
@@ -1085,7 +1085,7 @@
                     ],
                     rate: {
                       total: 47,
-                      achieved: 2 + faker.datatype.number(45),
+                      achieved: 2 + faker.number.int(45),
                     },
                   },
                 ],
@@ -1095,8 +1095,8 @@
                     name: "NieR Replicant ver.1.22474487139...",
                     icon:
                       "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCABAAEADASIAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAABgcDBQEECAIA/8QAMBAAAQMDAgUCBgEFAQAAAAAAAQIDBAAFERIhBhMxQVEHYRQiIzJCcRUIJFJigcH/xAAYAQADAQEAAAAAAAAAAAAAAAABAgMABP/EAB8RAAICAwACAwAAAAAAAAAAAAABAhEDEiEEQSIxYf/aAAwDAQACEQMRAD8A6m228CgT1PmN/DtMDd1s6z+jRfebg3abVJnSN2mEa1fqubeKOOBxNcBYoTwTcpaylxfX6Z+0DwaWT9FsMbezNluY5e3Jdpt0hoMqRh94jIx4HvV9ZbVHs0NMa3r5YTuvmb6vcV9Bsjdkt6GorJ0gfMvuVd81aWpUfWEqBKldSqpHV+lhHZCmNTbqSfyFYdjoQgKdSS0fzHQVOuGIriXUk8rqfet55DcVkTYg5jB+9pW9YWynjKkR5BcjFL7H+o3o1tPEbbiEtyxy1dM0K3S2amhMthUjI1AZ2J8YrUtt6DTyBcGg2UnAKhso0U6BKCmi09dLkm3cEvLdUUtuZSrfqKQ/oPbbchM6+SAVzHCUoKznAB2xTj/qVZMn08faQkqdVnTjzQF6dQmWOD4fKQOcjdxI/VNJ0LiXxDNy5FlvXo5jRPzHskeTUciNFmR0vwZCQ71Tg7ZoUeW6J5nWtZkxSdDzIOdGKEo/FlxmcQqZiwHmilWFJ7Y84qd2X1G1br4/8O7BeSEuDrqGc/qpLZc+RJMaUfpObJBPehlm6KU+0uc1yXBsVEdRUvEENu5RNKlrQtr6jC0Kxk1vsDjQfEKjRgw25g5K0at+teNUG5RXTIbCHEjC09/2KHrRc0XaAwlSyHUfTO++1ef5Q2+4FqajY7ax0Ioi6tBd6o2r+QjxtassqUQR2G1IK4sXPh65MXC3zELjh0pcjAbhI710h6gsvOWlHJISkElRPakTxE6yxqclIPwh+Vah296M+MGDsFZZw1CU4LjDQYsh0AOxldFjyBWxHgMc9UlLaQ6vZeBUMN2JCjMhb6dKkhSD3welbLMqDJePwMlLjgGVpT2qTtnSlqZlRfiHmFLwW0KyoeR4qJUpLbHORlbTSjgf+VsPvKDiUspKlDqmhuXJ+HYfLSgVJJOj/I+KMX6Fkm+klhuTFr4mXHQomPJwUgncKO5ovvqorrzSJK0pc/An8vakxeHC1Li3SM5qTHXrUQe/cVf8cX1f8FAfOdThyhwHocU9E2unQ/EUkXO3PvNqKYUdOvmdnD4pK8ZRFOfGW6WOWmUyChRGwB3FP3iRtL1qctkZCUuSRpAA2T7mgj1UtammLNISxzQkhp9SR9oCetPJeyGGdcOd/TG4G7zXbBc1KE2EsqjLUdl74A99qawZgWNouTHWoh/LVjKjSC9WZbNt4nactWuNNbOoqScZHagGVcrlOK3JEyS7k5IU4SKDx7O0Os+q1as6Ru/FYkkpgILLWcKWo/cPY0u+LuNmYrzTMJfMcZOsqB2UT2pdyOILm+xyVu4RpCfl2OKqMkryrJPcmtHHTthyeTaqKDnh3idtiW9FkkqgSDqyo50LO5/5RFd7wzcOCp0DX/cxAXU7/iemKUmQVbZx4qQOuDOHFZIwd+o8GncVdkFmdas//9k=",
-                    playtime: faker.datatype.number(100),
-                    played: faker.date.recent(10).getTime(),
+                    playtime: faker.number.int(100),
+                    played: faker.date.recent({days:10}).getTime(),
                     description: "The upgraded prequel of NieR:Automata. A kind young man sets out with Grimoire Weiss, a strange talking book, to search for the &quot;Sealed verses&quot; in order to save his sister Yonah, who fell terminally ill to the Black Scrawl.",
                     genres: [
                       "Action",
@@ -1108,7 +1108,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAwUGBAL/xAAsEAACAgEDAwMDAwUAAAAAAAABAgMEBQAGERIhMSJBUQdhkRMUoRVDUnGz/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/xAAYEQEBAQEBAAAAAAAAAAAAAAABACERMf/aAAwDAQACEQMRAD8AsL+R3Jkd+5LEYnIrSr1Yo2QGFGDcqpJLEE88t4+2rbA08hXQDJ5N70jEDkxIgX/XSBzoWMxpr5vK3XPa08ZUD2CoF/PY6lZs7uaDaW9LmTr16NnHGT9nJGvVwvSCOxPq4DDhu3f21fcJ5a89nb8eKwVqKZ68mTtCoqxlAFLu3Qx6lbn0qPHzrNHlM5S3thcdcumercezDIpVCrGOIOGUhVIIblSD8ffSjIY3LZPZGzYzXS3LjpoLd4GRY1SJULBT1Hu3Qy/Y9/GqLH4dpc7jrP8ASWoVcfLI9UGRWLCVGMh4UkKvUV4HnudXCk+x+XisZ3IYz+9VCNz8hlB/jn+dSP1ZuGrs/dNeM8SW3pRIB5P6pCH/AJnXGWo7mxu/psvhKAvU7CKsimRF6V4UMOGYEN6fPfzphujZ1rPSLPDk7UD8wSiKZ+tVkicsvt7Bm4+CffUOCMYONyd/IboyG344QsVXJdVtyhCrVijjWNAf8pGX8Bu3fVVdz9SvuOhhnk5u3EeQIO5CgE8n8HSXBbZtbeny08Vy1dSy5siL9YiWWXjv1sex5+dI8Bh9yZL6hRbg3Jj4aaVYmihCOpBUhgPDE8+s8nto8Zt//9k=",
                         achieved: true,
-                        unlocked: faker.date.recent(10).getTime(),
+                        unlocked: faker.date.recent({days:10}).getTime(),
                         name: "e8 a8 98 e6 86 b6 e3 82 b5 e3 83 bc e3 83 90 e3 83 bc",
                         description: "",
                         id: "ACHIEVEMENT_0230",
@@ -1117,7 +1117,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAABgQFBwP/xAAsEAACAQQBAwIFBAMAAAAAAAABAgMEBQYRABIhMSJBBxMUUaEVIzJhUnGC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/8QAGhEAAwEBAQEAAAAAAAAAAAAAAAERIUExMv/aAAwDAQACEQMRAD8AXZJe7vT5DVJLe1sVvR1hgeeCN4JGIH8pvV0MdghXC/0TxvY6S4UsJ/Urm9fIwBBMSIF/10gb5Gp7LG9wvclZFHPTXAorQyKHR0EYUgg+ffgDNbZk2BWSeuw27O1hh0Xt9SonajUt5iZgT0bIBU9wD7+z9Yi8HGaV60ENKTkMVmknf5MRljV1lc6+4Ovbv4G+/CtFeMnt3xHtljvVfFU09XHI5VIkA0EYqdgAhtr48a4dseE5ZltTb8lya4W2qi6FqKairY2eKRWXYUqmgi999tkHR0eaHHZK2qyS23m809ujq6cMiCjeR+gFWB6mYAMNHQAUd/f244sDWW1vu8VRfbhbN/vUoRt/cMoP43+eTLxQpdLPX2+TulVTyQn/AKUgfnXM9yCgyy3ZrV3fG6GOtiqIgvTI6BV9KgjTMp36B3/vifFbvks88aX/AB40miCZ4qiNl2D/AIhiRzM6hp0+Gc/1Hw7xqQb39BErb9mUdJ/IPJtZfqSmyKgszODW1aNIqDyFAJ2fsPSeVCxX+wYvFQ2e3U1wrIzN8tvniNEBlZkBDaJPSwHkDY88O4xaMpuWd02QZVb4KN6WBoUETp0nYYDQDMd+o8YnWV4f/9k=",
                         achieved: true,
-                        unlocked: faker.date.recent(10).getTime(),
+                        unlocked: faker.date.recent({days:10}).getTime(),
                         name: "Daredevil",
                         description: "",
                         id: "ACHIEVEMENT_0460",
@@ -1125,7 +1125,7 @@
                     ],
                     rate: {
                       total: 47,
-                      achieved: 2 + faker.datatype.number(45),
+                      achieved: 2 + faker.number.int(45),
                     },
                   },
                 ],
@@ -1141,18 +1141,18 @@
               sections: options["leetcode.sections"].split(",").map(x => x.trim()).filter(x => x),
               languages: new Array(6).fill(null).map(_ => ({
                 language: faker.hacker.noun(),
-                solved: faker.datatype.number(200),
+                solved: faker.number.int(200),
               })),
               skills: new Array(Number(options["leetcode.limit.skills"]) || 10).fill(null).map(_ => ({
                 name: faker.hacker.noun(),
                 category: faker.helpers.arrayElement(["advanced", "intermediate", "fundamental"]),
-                solved: faker.datatype.number(30),
+                solved: faker.number.int(30),
               })),
               problems: {
-                All: {count: 2402, solved: faker.datatype.number(2402)},
-                Easy: {count: 592, solved: faker.datatype.number(592)},
-                Medium: {count: 1283, solved: faker.datatype.number(1283)},
-                Hard: {count: 527, solved: faker.datatype.number(527)},
+                All: {count: 2402, solved: faker.number.int(2402)},
+                Easy: {count: 592, solved: faker.number.int(592)},
+                Medium: {count: 1283, solved: faker.number.int(1283)},
+                Hard: {count: 527, solved: faker.number.int(527)},
               },
               recent: new Array(Number(options["leetcode.limit.recent"]) || 2).fill(null).map(_ => ({
                 title: faker.lorem.sentence(),
@@ -1171,12 +1171,12 @@
                 Date: faker.date.recent().toISOString().substring(0, 10),
                 White: options["chess.user"],
                 Black: faker.internet.userName(),
-                WhiteElo: faker.datatype.number(3000),
-                BlackElo: faker.datatype.number(3000),
+                WhiteElo: faker.number.int(3000),
+                BlackElo: faker.number.int(3000),
               },
               animation: {size: 40, delay: 3, duration: 0.6},
               result: {
-                white: faker.datatype.number(3),
+                white: faker.number.int(3),
                 get black() {
                   return this.white + faker.helpers.arrayElement([-1, +1])
                 },
@@ -1199,7 +1199,7 @@
                 [
                   {
                     type: "push",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     size: 1,
                     branch: "master",
                     commits: [{sha: faker.git.shortSha(), message: faker.lorem.sentence()}],
@@ -1208,7 +1208,7 @@
                   {
                     type: "comment",
                     on: "commit",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     content: faker.lorem.paragraph(),
                     user: set.user,
                     mobile: null,
@@ -1219,99 +1219,99 @@
                   {
                     type: "comment",
                     on: "pr",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     content: faker.lorem.sentence(),
                     user: set.user,
                     mobile: null,
-                    number: faker.datatype.number(100),
+                    number: faker.number.int(100),
                     title: faker.lorem.sentence(),
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "comment",
                     on: "issue",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     content: faker.lorem.sentence(),
                     user: set.user,
                     mobile: null,
-                    number: faker.datatype.number(100),
+                    number: faker.number.int(100),
                     title: faker.lorem.sentence(),
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "issue",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     action: faker.helpers.arrayElement(["opened", "closed", "reopened"]),
                     user: set.user,
-                    number: faker.datatype.number(100),
+                    number: faker.number.int(100),
                     title: faker.lorem.sentence(),
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "pr",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     action: faker.helpers.arrayElement(["opened", "closed"]),
                     user: set.user,
-                    number: faker.datatype.number(100),
+                    number: faker.number.int(100),
                     title: faker.lorem.sentence(),
-                    lines: {added: faker.datatype.number(1000), deleted: faker.datatype.number(1000)},
-                    files: {changed: faker.datatype.number(10)},
+                    lines: {added: faker.number.int(1000), deleted: faker.number.int(1000)},
+                    files: {changed: faker.number.int(10)},
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "wiki",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     pages: [faker.lorem.sentence(), faker.lorem.sentence()],
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "fork",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "review",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     user: set.user,
-                    number: faker.datatype.number(100),
+                    number: faker.number.int(100),
                     title: faker.lorem.sentence(),
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "release",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     action: "published",
-                    name: faker.random.words(4),
+                    name: faker.lorem.words(4),
                     draft: faker.datatype.boolean(),
                     prerelease: faker.datatype.boolean(),
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "ref/create",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     ref: {name: faker.lorem.slug(), type: faker.helpers.arrayElement(["tag", "branch"])},
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "ref/delete",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     ref: {name: faker.lorem.slug(), type: faker.helpers.arrayElement(["tag", "branch"])},
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "member",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     user: set.user,
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "public",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     timestamp: faker.date.recent(),
                   },
                   {
                     type: "star",
-                    repo: `${faker.random.word()}/${faker.random.word()}`,
+                    repo: `${faker.lorem.word()}/${faker.lorem.word()}`,
                     action: "started",
                     timestamp: faker.date.recent(),
                   },
@@ -1324,8 +1324,8 @@
         ...(set.plugins.enabled.isocalendar
           ? ({
             isocalendar: {
-              streak: {max: 30 + faker.datatype.number(20), current: faker.datatype.number(30)},
-              max: 10 + faker.datatype.number(40),
+              streak: {max: 30 + faker.number.int(20), current: faker.number.int(30)},
+              max: 10 + faker.number.int(40),
               average: faker.datatype.float(10),
               svg: await staticPlaceholder(set.plugins.enabled.isocalendar, `isocalendar.${options["isocalendar.duration"]}.svg`),
               duration: options["isocalendar.duration"],
@@ -1340,9 +1340,9 @@
                 year: new Date().getFullYear() - index,
                 weeks: new Array(53).fill(0).map(() => ({
                   contributionDays: new Array(7).fill(0).map(() => ({
-                    contributionCount: faker.datatype.number(10),
+                    contributionCount: faker.number.int(10),
                     color: faker.helpers.arrayElement(["#ebedf0", "#ebedf0", "#ebedf0", "#ebedf0", "#ebedf0", "#ebedf0", "#9be9a8", "#9be9a8", "#9be9a8", "#40c463", "#40c463", "#30a14e", "#216e39"]),
-                    date: faker.date.past(365),
+                    date: faker.date.past({years:1}),
                   })),
                 })),
               })),
@@ -1353,8 +1353,8 @@
         ...(set.plugins.enabled.support
           ? ({
             support: {
-              stats: {solutions: faker.datatype.number(100), posts: faker.datatype.number(1000), topics: faker.datatype.number(1000), received: faker.datatype.number(1000), hearts: faker.datatype.number(1000)},
-              badges: {uniques: [], multiples: [], count: faker.datatype.number(1000)},
+              stats: {solutions: faker.number.int(100), posts: faker.number.int(1000), topics: faker.number.int(1000), received: faker.number.int(1000), hearts: faker.number.int(1000)},
+              badges: {uniques: [], multiples: [], count: faker.number.int(1000)},
             },
           })
           : null),
@@ -1387,26 +1387,26 @@
               sections: options["stackoverflow.sections"].split(",").map(x => x.trim()).filter(x => x),
               lines: options["stackoverflow.lines"],
               user: {
-                reputation: faker.datatype.number(100000),
-                badges: faker.datatype.number(1000),
-                questions: faker.datatype.number(1000),
-                answers: faker.datatype.number(1000),
-                comments: faker.datatype.number(1000),
-                views: faker.datatype.number(1000),
+                reputation: faker.number.int(100000),
+                badges: faker.number.int(1000),
+                questions: faker.number.int(1000),
+                answers: faker.number.int(1000),
+                comments: faker.number.int(1000),
+                views: faker.number.int(1000),
               },
               "answers-top": new Array(options["stackoverflow.limit"]).fill(null).map(_ => ({
                 type: "answer",
                 body: faker.lorem.paragraphs(),
-                score: faker.datatype.number(1000),
-                upvotes: faker.datatype.number(1000),
-                downvotes: faker.datatype.number(1000),
+                score: faker.number.int(1000),
+                upvotes: faker.number.int(1000),
+                downvotes: faker.number.int(1000),
                 accepted: faker.datatype.boolean(),
-                comments: faker.datatype.number(1000),
+                comments: faker.number.int(1000),
                 author: set.user,
                 created: "01/01/1970",
                 link: null,
-                id: faker.datatype.number(100000),
-                question_id: faker.datatype.number(100000),
+                id: faker.number.int(100000),
+                question_id: faker.number.int(100000),
                 question: {
                   title: faker.lorem.sentence(),
                   tags: [faker.lorem.slug(), faker.lorem.slug()],
@@ -1419,20 +1419,20 @@
                 type: "question",
                 title: faker.lorem.sentence(),
                 body: faker.lorem.paragraphs(),
-                score: faker.datatype.number(1000),
-                upvotes: faker.datatype.number(1000),
-                downvotes: faker.datatype.number(1000),
-                favorites: faker.datatype.number(1000),
+                score: faker.number.int(1000),
+                upvotes: faker.number.int(1000),
+                downvotes: faker.number.int(1000),
+                favorites: faker.number.int(1000),
                 tags: [faker.lorem.slug(), faker.lorem.slug()],
                 answered: faker.datatype.boolean(),
-                answers: faker.datatype.number(1000),
-                comments: faker.datatype.number(1000),
-                views: faker.datatype.number(1000),
+                answers: faker.number.int(1000),
+                comments: faker.number.int(1000),
+                views: faker.number.int(1000),
                 author: set.user,
                 created: "01/01/1970",
                 link: null,
-                id: faker.datatype.number(100000),
-                accepted_answer_id: faker.datatype.number(100000),
+                id: faker.number.int(100000),
+                accepted_answer_id: faker.number.int(100000),
                 answer: null,
               })),
               get ["questions-recent"]() {
diff --git a/tests/mocks/api/axios/get/lastfm.mjs b/tests/mocks/api/axios/get/lastfm.mjs
index 56be8758ffa..36360b50a11 100644
--- a/tests/mocks/api/axios/get/lastfm.mjs
+++ b/tests/mocks/api/axios/get/lastfm.mjs
@@ -5,9 +5,9 @@ export default function({faker, url, options, login = faker.internet.userName()}
     //Get recently played tracks
     if (/user.getrecenttracks/.test(url)) {
       console.debug(`metrics/compute/mocks > mocking lastfm api result > ${url}`)
-      const artist = faker.random.word()
-      const album = faker.random.words(3)
-      const track = faker.random.words(5)
+      const artist = faker.lorem.word()
+      const album = faker.lorem.words(3)
+      const track = faker.lorem.words(5)
       const date = faker.date.recent()
       return ({
         status: 200,
@@ -64,8 +64,8 @@ export default function({faker, url, options, login = faker.internet.userName()}
     }
     else if (/user.gettoptracks/.test(url)) {
       console.debug(`metrics/compute/mocks > mocking lastfm api result > ${url}`)
-      const artist = faker.random.word()
-      const track = faker.random.words(5)
+      const artist = faker.lorem.word()
+      const track = faker.lorem.words(5)
       return ({
         status: 200,
         data: {
@@ -112,7 +112,7 @@ export default function({faker, url, options, login = faker.internet.userName()}
     }
     else if (/user.gettopartists/.test(url)) {
       console.debug(`metrics/compute/mocks > mocking lastfm api result > ${url}`)
-      const artist = faker.random.word()
+      const artist = faker.lorem.word()
       const playcount = faker.random.number()
       return ({
         status: 200,
diff --git a/tests/mocks/api/axios/get/nightscout.mjs b/tests/mocks/api/axios/get/nightscout.mjs
index 65920d0c576..c5abf533e52 100644
--- a/tests/mocks/api/axios/get/nightscout.mjs
+++ b/tests/mocks/api/axios/get/nightscout.mjs
@@ -12,8 +12,8 @@ export default function({faker, url}) {
         device: "xDrip-DexcomG5",
         date: lastInterval,
         dateString: new Date(lastInterval).toISOString(),
-        sgv: faker.datatype.number({min: 40, max: 400}),
-        delta: faker.datatype.number({min: -10, max: 10}),
+        sgv: faker.number.int({min: 40, max: 400}),
+        delta: faker.number.int({min: -10, max: 10}),
         direction: faker.helpers.arrayElement(["SingleUp", "DoubleUp", "FortyFiveUp", "Flat", "FortyFiveDown", "SingleDown", "DoubleDown"]),
         type: "sgv",
         filtered: 0,
@@ -21,7 +21,7 @@ export default function({faker, url}) {
         rssi: 100,
         noise: 1,
         sysTime: new Date(lastInterval).toISOString(),
-        utcOffset: faker.datatype.number({min: -12, max: 14}) * 60,
+        utcOffset: faker.number.int({min: -12, max: 14}) * 60,
       })),
     })
   }
diff --git a/tests/mocks/api/axios/get/pagespeed.mjs b/tests/mocks/api/axios/get/pagespeed.mjs
index c1dcd779423..c958954e32d 100644
--- a/tests/mocks/api/axios/get/pagespeed.mjs
+++ b/tests/mocks/api/axios/get/pagespeed.mjs
@@ -34,40 +34,40 @@ export default function({faker, url, options, login = faker.internet.userName()}
                 details: {
                   items: [
                     {
-                      observedFirstContentfulPaint: faker.datatype.number(500),
+                      observedFirstContentfulPaint: faker.number.int(500),
                       observedFirstVisualChangeTs: faker.date.recent(),
                       observedFirstContentfulPaintTs: faker.date.recent(),
-                      firstContentfulPaint: faker.datatype.number(500),
-                      observedDomContentLoaded: faker.datatype.number(500),
-                      observedFirstMeaningfulPaint: faker.datatype.number(1000),
-                      maxPotentialFID: faker.datatype.number(500),
-                      observedLoad: faker.datatype.number(500),
-                      firstMeaningfulPaint: faker.datatype.number(500),
+                      firstContentfulPaint: faker.number.int(500),
+                      observedDomContentLoaded: faker.number.int(500),
+                      observedFirstMeaningfulPaint: faker.number.int(1000),
+                      maxPotentialFID: faker.number.int(500),
+                      observedLoad: faker.number.int(500),
+                      firstMeaningfulPaint: faker.number.int(500),
                       observedCumulativeLayoutShift: faker.datatype.float({max: 1}),
-                      observedSpeedIndex: faker.datatype.number(1000),
+                      observedSpeedIndex: faker.number.int(1000),
                       observedSpeedIndexTs: faker.date.recent(),
                       observedTimeOriginTs: faker.date.recent(),
-                      observedLargestContentfulPaint: faker.datatype.number(1000),
+                      observedLargestContentfulPaint: faker.number.int(1000),
                       cumulativeLayoutShift: faker.datatype.float({max: 1}),
                       observedFirstPaintTs: faker.date.recent(),
                       observedTraceEndTs: faker.date.recent(),
-                      largestContentfulPaint: faker.datatype.number(2000),
-                      observedTimeOrigin: faker.datatype.number(10),
-                      speedIndex: faker.datatype.number(1000),
-                      observedTraceEnd: faker.datatype.number(2000),
+                      largestContentfulPaint: faker.number.int(2000),
+                      observedTimeOrigin: faker.number.int(10),
+                      speedIndex: faker.number.int(1000),
+                      observedTraceEnd: faker.number.int(2000),
                       observedDomContentLoadedTs: faker.date.recent(),
-                      observedFirstPaint: faker.datatype.number(500),
-                      totalBlockingTime: faker.datatype.number(500),
+                      observedFirstPaint: faker.number.int(500),
+                      totalBlockingTime: faker.number.int(500),
                       observedLastVisualChangeTs: faker.date.recent(),
-                      observedFirstVisualChange: faker.datatype.number(500),
+                      observedFirstVisualChange: faker.number.int(500),
                       observedLargestContentfulPaintTs: faker.date.recent(),
-                      estimatedInputLatency: faker.datatype.number(100),
+                      estimatedInputLatency: faker.number.int(100),
                       observedLoadTs: faker.date.recent(),
-                      observedLastVisualChange: faker.datatype.number(1000),
-                      firstCPUIdle: faker.datatype.number(1000),
-                      interactive: faker.datatype.number(1000),
+                      observedLastVisualChange: faker.number.int(1000),
+                      firstCPUIdle: faker.number.int(1000),
+                      interactive: faker.number.int(1000),
                       observedNavigationStartTs: faker.date.recent(),
-                      observedNavigationStart: faker.datatype.number(10),
+                      observedNavigationStart: faker.number.int(10),
                       observedFirstMeaningfulPaintTs: faker.date.recent(),
                     },
                   ],
@@ -98,7 +98,7 @@ export default function({faker, url, options, login = faker.internet.userName()}
               pwa: {
                 id: "pwa",
                 title: "PWA",
-                score: faker.datatype.number({max: 1}),
+                score: faker.number.int({max: 1}),
               },
             },
           },
diff --git a/tests/mocks/api/axios/get/poopmap.mjs b/tests/mocks/api/axios/get/poopmap.mjs
index d6b340c4e3a..cb1a4846766 100644
--- a/tests/mocks/api/axios/get/poopmap.mjs
+++ b/tests/mocks/api/axios/get/poopmap.mjs
@@ -8,16 +8,16 @@ export default function({faker, url, options, login = faker.internet.userName()}
       return ({
         status: 200,
         data: {
-          poops: new Array(12 + faker.datatype.number(6)).fill(null).map(_ => ({
+          poops: new Array(12 + faker.number.int(6)).fill(null).map(_ => ({
             id: 79744699,
-            latitude: faker.address.latitude(),
-            longitude: faker.address.longitude(),
+            latitude: faker.location.latitude(),
+            longitude: faker.location.longitude(),
             created_at: faker.date.past().toISOString(),
             note: "",
             place: "",
-            rating: faker.datatype.number(5),
-            followers_count: faker.datatype.number(100),
-            comments_count: faker.datatype.number(12),
+            rating: faker.number.int(5),
+            followers_count: faker.number.int(100),
+            comments_count: faker.number.int(12),
           })),
         },
       })
diff --git a/tests/mocks/api/axios/get/spotify.mjs b/tests/mocks/api/axios/get/spotify.mjs
index 70272877384..1519754ba8b 100644
--- a/tests/mocks/api/axios/get/spotify.mjs
+++ b/tests/mocks/api/axios/get/spotify.mjs
@@ -5,8 +5,8 @@ export default function({faker, url, options, login = faker.internet.userName()}
     //Get recently played tracks
     if (/me.player.recently-played/.test(url) && (options?.headers?.Authorization === "Bearer MOCKED_TOKEN_ACCESS")) {
       console.debug(`metrics/compute/mocks > mocking spotify api result > ${url}`)
-      const artist = faker.random.words()
-      const track = faker.random.words(5)
+      const artist = faker.lorem.words()
+      const track = faker.lorem.words(5)
       return ({
         status: 200,
         data: {
@@ -63,8 +63,8 @@ export default function({faker, url, options, login = faker.internet.userName()}
     }
     else if (/me.top.tracks/.test(url) && (options?.headers?.Authorization === "Bearer MOCKED_TOKEN_ACCESS")) {
       console.debug(`metrics/compute/mocks > mocking spotify api result > ${url}`)
-      const artist = faker.random.words()
-      const track = faker.random.words(5)
+      const artist = faker.lorem.words()
+      const track = faker.lorem.words(5)
       return ({
         status: 200,
         data: {
@@ -115,8 +115,8 @@ export default function({faker, url, options, login = faker.internet.userName()}
     }
     else if (/me.top.artists/.test(url) && (options?.headers?.Authorization === "Bearer MOCKED_TOKEN_ACCESS")) {
       console.debug(`metrics/compute/mocks > mocking spotify api result > ${url}`)
-      const genre = faker.random.words()
-      const track = faker.random.words(5)
+      const genre = faker.lorem.words()
+      const track = faker.lorem.words(5)
       return ({
         status: 200,
         data: {
diff --git a/tests/mocks/api/axios/get/stackoverflow.mjs b/tests/mocks/api/axios/get/stackoverflow.mjs
index 62aac340df0..e4cd11199ef 100644
--- a/tests/mocks/api/axios/get/stackoverflow.mjs
+++ b/tests/mocks/api/axios/get/stackoverflow.mjs
@@ -13,20 +13,20 @@ export default function({faker, url, options, login = faker.internet.userName()}
         data: {
           items: [
             {
-              badge_counts: {bronze: faker.datatype.number(500), silver: faker.datatype.number(300), gold: faker.datatype.number(100)},
-              accept_rate: faker.datatype.number(100),
-              answer_count: faker.datatype.number(1000),
-              question_count: faker.datatype.number(1000),
-              view_count: faker.datatype.number(10000),
+              badge_counts: {bronze: faker.number.int(500), silver: faker.number.int(300), gold: faker.number.int(100)},
+              accept_rate: faker.number.int(100),
+              answer_count: faker.number.int(1000),
+              question_count: faker.number.int(1000),
+              view_count: faker.number.int(10000),
               creation_date: faker.date.past(),
               display_name: faker.internet.userName(),
               user_id,
-              reputation: faker.datatype.number(100000),
+              reputation: faker.number.int(100000),
             },
           ],
           has_more: false,
           quota_max: 300,
-          quota_remaining: faker.datatype.number(300),
+          quota_remaining: faker.number.int(300),
         },
       })
     }
@@ -36,7 +36,7 @@ export default function({faker, url, options, login = faker.internet.userName()}
       return ({
         status: 200,
         data: {
-          total: faker.datatype.number(10000),
+          total: faker.number.int(10000),
         },
       })
     }
@@ -50,23 +50,23 @@ export default function({faker, url, options, login = faker.internet.userName()}
             tags: new Array(5).fill(null).map(_ => faker.lorem.slug()),
             owner: {display_name: faker.internet.userName()},
             is_answered: faker.datatype.boolean(),
-            view_count: faker.datatype.number(10000),
-            accepted_answer_id: faker.datatype.number(1000000),
-            answer_count: faker.datatype.number(100),
-            score: faker.datatype.number(1000),
+            view_count: faker.number.int(10000),
+            accepted_answer_id: faker.number.int(1000000),
+            answer_count: faker.number.int(100),
+            score: faker.number.int(1000),
             creation_date: faker.date.recent(),
-            down_vote_count: faker.datatype.number(1000),
-            up_vote_count: faker.datatype.number(1000),
-            comment_count: faker.datatype.number(1000),
-            favorite_count: faker.datatype.number(1000),
+            down_vote_count: faker.number.int(1000),
+            up_vote_count: faker.number.int(1000),
+            comment_count: faker.number.int(1000),
+            favorite_count: faker.number.int(1000),
             title: faker.lorem.sentence(),
             body_markdown: faker.lorem.paragraphs(),
             link: faker.internet.url(),
-            question_id: faker.datatype.number(1000000),
+            question_id: faker.number.int(1000000),
           })),
           has_more: false,
           quota_max: 300,
-          quota_remaining: faker.datatype.number(300),
+          quota_remaining: faker.number.int(300),
         },
       })
     }
@@ -80,18 +80,18 @@ export default function({faker, url, options, login = faker.internet.userName()}
             owner: {display_name: faker.internet.userName()},
             link: faker.internet.url(),
             is_accepted: faker.datatype.boolean(),
-            score: faker.datatype.number(1000),
-            down_vote_count: faker.datatype.number(1000),
-            up_vote_count: faker.datatype.number(1000),
-            comment_count: faker.datatype.number(1000),
+            score: faker.number.int(1000),
+            down_vote_count: faker.number.int(1000),
+            up_vote_count: faker.number.int(1000),
+            comment_count: faker.number.int(1000),
             creation_date: faker.date.recent(),
-            question_id: faker.datatype.number(1000000),
+            question_id: faker.number.int(1000000),
             body_markdown: faker.lorem.paragraphs(),
-            answer_id: faker.datatype.number(1000000),
+            answer_id: faker.number.int(1000000),
           })),
           has_more: false,
           quota_max: 300,
-          quota_remaining: faker.datatype.number(300),
+          quota_remaining: faker.number.int(300),
         },
       })
     }
diff --git a/tests/mocks/api/axios/get/steam.mjs b/tests/mocks/api/axios/get/steam.mjs
index 3ebb23e623f..afd0588e0c1 100644
--- a/tests/mocks/api/axios/get/steam.mjs
+++ b/tests/mocks/api/axios/get/steam.mjs
@@ -1537,7 +1537,7 @@ export default function({faker, url, options, login = faker.internet.userName()}
         status: 200,
         data: {
           response: {
-            player_level: faker.datatype.number(500),
+            player_level: faker.number.int(500),
           },
         },
       })
diff --git a/tests/mocks/api/axios/get/twitter.mjs b/tests/mocks/api/axios/get/twitter.mjs
index 916cc7c147f..c23ccb544e1 100644
--- a/tests/mocks/api/axios/get/twitter.mjs
+++ b/tests/mocks/api/axios/get/twitter.mjs
@@ -10,10 +10,10 @@ export default function({faker, url, options, login = faker.internet.userName()}
         status: 200,
         data: {
           data: {
-            profile_image_url: faker.image.people(),
-            name: faker.name.fullName(),
+            profile_image_url: faker.image.urlLoremFlickr({ category: 'people' }),
+            name: faker.person.fullName(),
             verified: faker.datatype.boolean(),
-            id: faker.datatype.number(1000000).toString(),
+            id: faker.number.int(1000000).toString(),
             username,
           },
         },
@@ -27,7 +27,7 @@ export default function({faker, url, options, login = faker.internet.userName()}
         data: {
           data: [
             {
-              id: faker.datatype.number(100000000000000).toString(),
+              id: faker.number.int(100000000000000).toString(),
               created_at: `${faker.date.recent()}`,
               entities: {
                 mentions: [
@@ -37,7 +37,7 @@ export default function({faker, url, options, login = faker.internet.userName()}
               text: "Checkout metrics from @lowlighter ! #GitHub",
             },
             {
-              id: faker.datatype.number(100000000000000).toString(),
+              id: faker.number.int(100000000000000).toString(),
               created_at: `${faker.date.recent()}`,
               text: faker.lorem.paragraph(),
             },
@@ -45,15 +45,15 @@ export default function({faker, url, options, login = faker.internet.userName()}
           includes: {
             users: [
               {
-                id: faker.datatype.number(100000000000000).toString(),
+                id: faker.number.int(100000000000000).toString(),
                 name: "lowlighter",
                 username: "lowlighter",
               },
             ],
           },
           meta: {
-            newest_id: faker.datatype.number(100000000000000).toString(),
-            oldest_id: faker.datatype.number(100000000000000).toString(),
+            newest_id: faker.number.int(100000000000000).toString(),
+            oldest_id: faker.number.int(100000000000000).toString(),
             result_count: 2,
             next_token: "MOCKED_CURSOR",
           },
diff --git a/tests/mocks/api/axios/get/wakatime.mjs b/tests/mocks/api/axios/get/wakatime.mjs
index ce410f5a5df..563bed82f46 100644
--- a/tests/mocks/api/axios/get/wakatime.mjs
+++ b/tests/mocks/api/axios/get/wakatime.mjs
@@ -7,20 +7,20 @@ export default function({faker, url, options, login = faker.internet.userName()}
       console.debug(`metrics/compute/mocks > mocking wakatime api result > ${url}`)
       const stats = array => {
         const elements = []
-        let results = new Array(4 + faker.datatype.number(2)).fill(null).map(_ => ({
+        let results = new Array(4 + faker.number.int(2)).fill(null).map(_ => ({
           get digital() {
             return `${this.hours}:${this.minutes}`
           },
-          hours: faker.datatype.number(1000),
-          minutes: faker.datatype.number(1000),
-          name: array ? faker.helpers.arrayElement(array) : faker.random.words(2).replace(/ /g, "-").toLocaleLowerCase(),
+          hours: faker.number.int(1000),
+          minutes: faker.number.int(1000),
+          name: array ? faker.helpers.arrayElement(array) : faker.lorem.words(2).replace(/ /g, "-").toLocaleLowerCase(),
           percent: 0,
-          total_seconds: faker.datatype.number(1000000),
+          total_seconds: faker.number.int(1000000),
         }))
         results = results.filter(({name}) => elements.includes(name) ? false : (elements.push(name), true))
         let percents = 100
         for (const result of results) {
-          result.percent = 1 + ((percents - 1) <= 0 ? 0 : faker.datatype.number(percents - 1))
+          result.percent = 1 + ((percents - 1) <= 0 ? 0 : faker.number.int(percents - 1))
           percents -= result.percent
         }
         return results
@@ -32,11 +32,11 @@ export default function({faker, url, options, login = faker.internet.userName()}
             best_day: {
               created_at: faker.date.recent(),
               date: `${faker.date.recent()}`.substring(0, 10),
-              total_seconds: faker.datatype.number(1000000),
+              total_seconds: faker.number.int(1000000),
             },
             categories: stats(),
-            daily_average: faker.datatype.number(12 * 60 * 60),
-            daily_average_including_other_language: faker.datatype.number(12 * 60 * 60),
+            daily_average: faker.number.int(12 * 60 * 60),
+            daily_average_including_other_language: faker.number.int(12 * 60 * 60),
             dependencies: stats(),
             editors: stats(["VS Code", "Chrome", "IntelliJ", "PhpStorm", "WebStorm", "Android Studio", "Visual Studio", "Sublime Text", "PyCharm", "Vim", "Atom", "Xcode"]),
             languages: stats(["JavaScript", "TypeScript", "PHP", "Java", "Python", "Vue.js", "HTML", "C#", "JSON", "Dart", "SCSS", "Kotlin", "JSX", "Go", "Ruby", "YAML"]),
@@ -44,8 +44,8 @@ export default function({faker, url, options, login = faker.internet.userName()}
             operating_systems: stats(["Mac", "Windows", "Linux"]),
             project: null,
             projects: /api_key=MOCKED_TOKEN_NO_PROJECTS/.test(url) ? null : stats(),
-            total_seconds: faker.datatype.number(1000000000),
-            total_seconds_including_other_language: faker.datatype.number(1000000000),
+            total_seconds: faker.number.int(1000000000),
+            total_seconds_including_other_language: faker.number.int(1000000000),
           },
         },
       })
diff --git a/tests/mocks/api/axios/get/yahoo.mjs b/tests/mocks/api/axios/get/yahoo.mjs
index def386f4fbc..4b347d56521 100644
--- a/tests/mocks/api/axios/get/yahoo.mjs
+++ b/tests/mocks/api/axios/get/yahoo.mjs
@@ -10,23 +10,23 @@ export default function({faker, url, options, login = faker.internet.userName()}
         data: {
           price: {
             marketCap: {
-              raw: faker.datatype.number(1000000000),
+              raw: faker.number.int(1000000000),
             },
             symbol: "OCTO",
           },
           quoteType: {
             shortName: faker.company.name(),
             longName: faker.company.name(),
-            exchangeTimezoneName: faker.address.timeZone(),
+            exchangeTimezoneName: faker.location.timeZone(),
             symbol: "OCTO",
           },
           calendarEvents: {},
           summaryDetail: {},
           symbol: "OCTO",
           assetProfile: {
-            fullTimeEmployees: faker.datatype.number(10000),
-            city: faker.address.city(),
-            country: faker.address.country(),
+            fullTimeEmployees: faker.number.int(10000),
+            city: faker.location.city(),
+            country: faker.location.country(),
           },
         },
       })
@@ -43,15 +43,15 @@ export default function({faker, url, options, login = faker.internet.userName()}
                 meta: {
                   currency: "USD",
                   symbol: "OCTO",
-                  regularMarketPrice: faker.datatype.number(10000) / 100,
-                  chartPreviousClose: faker.datatype.number(10000) / 100,
-                  previousClose: faker.datatype.number(10000) / 100,
+                  regularMarketPrice: faker.number.int(10000) / 100,
+                  chartPreviousClose: faker.number.int(10000) / 100,
+                  previousClose: faker.number.int(10000) / 100,
                 },
                 timestamp: new Array(1000).fill(Date.now()).map((x, i) => x + i * 60000),
                 indicators: {
                   quote: [
                     {
-                      close: new Array(1000).fill(null).map(_ => faker.datatype.number(10000) / 100),
+                      close: new Array(1000).fill(null).map(_ => faker.number.int(10000) / 100),
                       get low() {
                         return this.close
                       },
diff --git a/tests/mocks/api/axios/post/anilist.mjs b/tests/mocks/api/axios/post/anilist.mjs
index c139208c1ec..fd9e725c330 100644
--- a/tests/mocks/api/axios/post/anilist.mjs
+++ b/tests/mocks/api/axios/post/anilist.mjs
@@ -8,14 +8,14 @@ export default function({faker, url, body, login = faker.internet.userName()}) {
       description: faker.lorem.paragraphs(),
       type,
       status: faker.helpers.arrayElement(["FINISHED", "RELEASING", "NOT_YET_RELEASED", "CANCELLED", "HIATUS"]),
-      episodes: 100 + faker.datatype.number(100),
-      volumes: faker.datatype.number(100),
-      chapters: 100 + faker.datatype.number(1000),
-      averageScore: faker.datatype.number(100),
+      episodes: 100 + faker.number.int(100),
+      volumes: faker.number.int(100),
+      chapters: 100 + faker.number.int(1000),
+      averageScore: faker.number.int(100),
       countryOfOrigin: "JP",
       genres: new Array(6).fill(null).map(_ => faker.lorem.word()),
       coverImage: {medium: null},
-      startDate: {year: faker.date.past(20).getFullYear()},
+      startDate: {year: faker.date.past({years:20}).getFullYear()},
     })
     //User statistics query
     if (/^query Statistics /.test(query)) {
@@ -25,20 +25,20 @@ export default function({faker, url, body, login = faker.internet.userName()}) {
         data: {
           data: {
             User: {
-              id: faker.datatype.number(100000),
+              id: faker.number.int(100000),
               name: faker.internet.userName(),
               about: null,
               statistics: {
                 anime: {
-                  count: faker.datatype.number(1000),
-                  minutesWatched: faker.datatype.number(100000),
-                  episodesWatched: faker.datatype.number(10000),
+                  count: faker.number.int(1000),
+                  minutesWatched: faker.number.int(100000),
+                  episodesWatched: faker.number.int(10000),
                   genres: new Array(4).fill(null).map(_ => ({genre: faker.lorem.word()})),
                 },
                 manga: {
-                  count: faker.datatype.number(1000),
-                  chaptersRead: faker.datatype.number(100000),
-                  volumesRead: faker.datatype.number(10000),
+                  count: faker.number.int(1000),
+                  chaptersRead: faker.number.int(100000),
+                  volumesRead: faker.number.int(10000),
                   genres: new Array(4).fill(null).map(_ => ({genre: faker.lorem.word()})),
                 },
               },
@@ -57,8 +57,8 @@ export default function({faker, url, body, login = faker.internet.userName()}) {
             User: {
               favourites: {
                 characters: {
-                  nodes: new Array(2 + faker.datatype.number(16)).fill(null).map(_ => ({
-                    name: {full: faker.name.fullName(), native: faker.name.fullName()},
+                  nodes: new Array(2 + faker.number.int(16)).fill(null).map(_ => ({
+                    name: {full: faker.person.fullName(), native: faker.person.fullName()},
                     image: {medium: null},
                   })),
                   pageInfo: {currentPage: 1, hasNextPage: false},
@@ -104,7 +104,7 @@ export default function({faker, url, body, login = faker.internet.userName()}) {
                   isCustomList: false,
                   entries: new Array(16).fill(null).map(_ => ({
                     status: faker.helpers.arrayElement(["CURRENT", "PLANNING", "COMPLETED", "DROPPED", "PAUSED", "REPEATING"]),
-                    progress: faker.datatype.number(100),
+                    progress: faker.number.int(100),
                     progressVolumes: null,
                     score: 0,
                     startedAt: {year: null, month: null, day: null},
diff --git a/tests/mocks/api/axios/post/leetcode.mjs b/tests/mocks/api/axios/post/leetcode.mjs
index 4d6ab1c9da2..5b4c8c3bca1 100644
--- a/tests/mocks/api/axios/post/leetcode.mjs
+++ b/tests/mocks/api/axios/post/leetcode.mjs
@@ -12,7 +12,7 @@ export default function({faker, url, body, login = faker.internet.userName()}) {
             matchedUser: {
               languageProblemCount: new Array(6).fill(null).map(_ => ({
                 languageName: faker.hacker.noun(),
-                problemsSolved: faker.datatype.number(200),
+                problemsSolved: faker.number.int(200),
               })),
             },
           },
@@ -31,17 +31,17 @@ export default function({faker, url, body, login = faker.internet.userName()}) {
                 advanced: new Array(6).fill(null).map(_ => ({
                   tagName: faker.hacker.noun(),
                   tagSlug: faker.lorem.slug(),
-                  problemsSolved: faker.datatype.number(200),
+                  problemsSolved: faker.number.int(200),
                 })),
                 intermediate: new Array(6).fill(null).map(_ => ({
                   tagName: faker.hacker.noun(),
                   tagSlug: faker.lorem.slug(),
-                  problemsSolved: faker.datatype.number(200),
+                  problemsSolved: faker.number.int(200),
                 })),
                 fundamental: new Array(6).fill(null).map(_ => ({
                   tagName: faker.hacker.noun(),
                   tagSlug: faker.lorem.slug(),
-                  problemsSolved: faker.datatype.number(200),
+                  problemsSolved: faker.number.int(200),
                 })),
               },
             },
@@ -70,10 +70,10 @@ export default function({faker, url, body, login = faker.internet.userName()}) {
               ],
               submitStatsGlobal: {
                 acSubmissionNum: [
-                  {difficulty: "All", count: faker.datatype.number(2402)},
-                  {difficulty: "Easy", count: faker.datatype.number(592)},
-                  {difficulty: "Medium", count: faker.datatype.number(1283)},
-                  {difficulty: "Hard", count: faker.datatype.number(527)},
+                  {difficulty: "All", count: faker.number.int(2402)},
+                  {difficulty: "Easy", count: faker.number.int(592)},
+                  {difficulty: "Medium", count: faker.number.int(1283)},
+                  {difficulty: "Hard", count: faker.number.int(527)},
                 ],
               },
             },
@@ -89,7 +89,7 @@ export default function({faker, url, body, login = faker.internet.userName()}) {
         data: {
           data: {
             recentAcSubmissionList: new Array(6).fill(null).map(_ => ({
-              id: `${faker.datatype.number(10000)}`,
+              id: `${faker.number.int(10000)}`,
               title: faker.lorem.sentence(),
               titleSlug: faker.lorem.slug(),
               timestamp: `${Math.round(faker.date.recent().getTime() / 1000)}`,
diff --git a/tests/mocks/api/axios/post/youtubemusic.mjs b/tests/mocks/api/axios/post/youtubemusic.mjs
index 29b8b523549..0e82379bca4 100644
--- a/tests/mocks/api/axios/post/youtubemusic.mjs
+++ b/tests/mocks/api/axios/post/youtubemusic.mjs
@@ -4,9 +4,9 @@ export default function({faker, url, options, login = faker.internet.userName()}
     //Get recently played tracks
     if (/browse/.test(url)) {
       console.debug(`metrics/compute/mocks > mocking yt music api result > ${url}`)
-      const artist = faker.random.word()
-      const track = faker.random.words(5)
-      const artwork = faker.image.imageUrl()
+      const artist = faker.lorem.word()
+      const track = faker.lorem.words(5)
+      const artwork = faker.image.url()
       return ({
         contents: {
           singleColumnBrowseResultsRenderer: {
diff --git a/tests/mocks/api/github/graphql/achievements.default.mjs b/tests/mocks/api/github/graphql/achievements.default.mjs
index ab981ff37fe..f7dbf96d6f7 100644
--- a/tests/mocks/api/github/graphql/achievements.default.mjs
+++ b/tests/mocks/api/github/graphql/achievements.default.mjs
@@ -10,7 +10,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
             nameWithOwner: `${faker.internet.userName()}/${faker.lorem.slug()}`,
           },
         ],
-        totalCount: faker.datatype.number(100),
+        totalCount: faker.number.int(100),
       },
       forks: {
         nodes: [
@@ -19,10 +19,10 @@ export default function({faker, query, login = faker.internet.userName()}) {
             nameWithOwner: `${faker.internet.userName()}/${faker.lorem.slug()}`,
           },
         ],
-        totalCount: faker.datatype.number(100),
+        totalCount: faker.number.int(100),
       },
       popular: {
-        nodes: [{stargazers: {totalCount: faker.datatype.number(50000)}}],
+        nodes: [{stargazers: {totalCount: faker.number.int(50000)}}],
       },
       pullRequests: {
         nodes: [
@@ -32,7 +32,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
             repository: {nameWithOwner: `${faker.internet.userName()}/${faker.lorem.slug()}`},
           },
         ],
-        totalCount: faker.datatype.number(50000),
+        totalCount: faker.number.int(50000),
       },
       contributionsCollection: {
         pullRequestReviewContributions: {
@@ -41,30 +41,30 @@ export default function({faker, query, login = faker.internet.userName()}) {
               occurredAt: faker.date.recent(),
               pullRequest: {
                 title: faker.lorem.sentence(),
-                number: faker.datatype.number(1000),
+                number: faker.number.int(1000),
                 repository: {nameWithOwner: `${faker.internet.userName()}/${faker.lorem.slug()}`},
               },
             },
           ],
-          totalCount: faker.datatype.number(1000),
+          totalCount: faker.number.int(1000),
         },
       },
-      projects: {totalCount: faker.datatype.number(100)},
-      packages: {totalCount: faker.datatype.number(100)},
-      organizations: {nodes: [], totalCount: faker.datatype.number(5)},
+      projects: {totalCount: faker.number.int(100)},
+      packages: {totalCount: faker.number.int(100)},
+      organizations: {nodes: [], totalCount: faker.number.int(5)},
       gists: {
         nodes: [{createdAt: faker.date.recent(), name: faker.lorem.slug()}],
-        totalCount: faker.datatype.number(1000),
+        totalCount: faker.number.int(1000),
       },
-      starredRepositories: {totalCount: faker.datatype.number(1000)},
-      followers: {totalCount: faker.datatype.number(10000)},
-      following: {totalCount: faker.datatype.number(10000)},
+      starredRepositories: {totalCount: faker.number.int(1000)},
+      followers: {totalCount: faker.number.int(10000)},
+      following: {totalCount: faker.number.int(10000)},
       bio: faker.lorem.sentence(),
       status: {message: faker.lorem.paragraph()},
-      sponsorshipsAsSponsor: {totalCount: faker.datatype.number(100)},
-      discussionsStarted: {totalCount: faker.datatype.number(1000)},
-      discussionsComments: {totalCount: faker.datatype.number(1000)},
-      discussionAnswers: {totalCount: faker.datatype.number(1000)},
+      sponsorshipsAsSponsor: {totalCount: faker.number.int(100)},
+      discussionsStarted: {totalCount: faker.number.int(1000)},
+      discussionsComments: {totalCount: faker.number.int(1000)},
+      discussionAnswers: {totalCount: faker.number.int(1000)},
     },
   })
 }
diff --git a/tests/mocks/api/github/graphql/achievements.organizations.mjs b/tests/mocks/api/github/graphql/achievements.organizations.mjs
index ed810d1660b..0e0f3793d12 100644
--- a/tests/mocks/api/github/graphql/achievements.organizations.mjs
+++ b/tests/mocks/api/github/graphql/achievements.organizations.mjs
@@ -10,7 +10,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
             nameWithOwner: `${faker.internet.userName()}/${faker.lorem.slug()}`,
           },
         ],
-        totalCount: faker.datatype.number(100),
+        totalCount: faker.number.int(100),
       },
       forks: {
         nodes: [
@@ -19,15 +19,15 @@ export default function({faker, query, login = faker.internet.userName()}) {
             nameWithOwner: `${faker.internet.userName()}/${faker.lorem.slug()}`,
           },
         ],
-        totalCount: faker.datatype.number(100),
+        totalCount: faker.number.int(100),
       },
       popular: {
-        nodes: [{stargazers: {totalCount: faker.datatype.number(50000)}}],
+        nodes: [{stargazers: {totalCount: faker.number.int(50000)}}],
       },
-      projects: {totalCount: faker.datatype.number(100)},
-      packages: {totalCount: faker.datatype.number(100)},
-      membersWithRole: {totalCount: faker.datatype.number(100)},
-      sponsorshipsAsSponsor: {totalCount: faker.datatype.number(100)},
+      projects: {totalCount: faker.number.int(100)},
+      packages: {totalCount: faker.number.int(100)},
+      membersWithRole: {totalCount: faker.number.int(100)},
+      sponsorshipsAsSponsor: {totalCount: faker.number.int(100)},
     },
   })
 }
diff --git a/tests/mocks/api/github/graphql/achievements.ranking.mjs b/tests/mocks/api/github/graphql/achievements.ranking.mjs
index 41e74e6be2e..0b4e554f855 100644
--- a/tests/mocks/api/github/graphql/achievements.ranking.mjs
+++ b/tests/mocks/api/github/graphql/achievements.ranking.mjs
@@ -2,11 +2,11 @@
 export default function({faker, query, login = faker.internet.userName()}) {
   console.debug("metrics/compute/mocks > mocking graphql api result > achievements/ranking")
   return ({
-    repo_rank: {repositoryCount: faker.datatype.number(100000)},
-    forks_rank: {repositoryCount: faker.datatype.number(100000)},
-    created_rank: {userCount: faker.datatype.number(100000)},
-    user_rank: {userCount: faker.datatype.number(100000)},
-    repo_total: {repositoryCount: faker.datatype.number(100000)},
-    user_total: {userCount: faker.datatype.number(100000)},
+    repo_rank: {repositoryCount: faker.number.int(100000)},
+    forks_rank: {repositoryCount: faker.number.int(100000)},
+    created_rank: {userCount: faker.number.int(100000)},
+    user_rank: {userCount: faker.number.int(100000)},
+    repo_total: {repositoryCount: faker.number.int(100000)},
+    user_total: {userCount: faker.number.int(100000)},
   })
 }
diff --git a/tests/mocks/api/github/graphql/base.contributions.mjs b/tests/mocks/api/github/graphql/base.contributions.mjs
index 04816fd2ef8..7a42f9e2b06 100644
--- a/tests/mocks/api/github/graphql/base.contributions.mjs
+++ b/tests/mocks/api/github/graphql/base.contributions.mjs
@@ -4,12 +4,12 @@ export default function({faker, query, login = faker.internet.userName()}) {
   return ({
     user: {
       contributionsCollection: {
-        totalRepositoriesWithContributedCommits: faker.datatype.number(100),
-        totalCommitContributions: faker.datatype.number(10000),
-        restrictedContributionsCount: faker.datatype.number(10000),
-        totalIssueContributions: faker.datatype.number(100),
-        totalPullRequestContributions: faker.datatype.number(1000),
-        totalPullRequestReviewContributions: faker.datatype.number(1000),
+        totalRepositoriesWithContributedCommits: faker.number.int(100),
+        totalCommitContributions: faker.number.int(10000),
+        restrictedContributionsCount: faker.number.int(10000),
+        totalIssueContributions: faker.number.int(100),
+        totalPullRequestContributions: faker.number.int(1000),
+        totalPullRequestReviewContributions: faker.number.int(1000),
       },
     },
   })
diff --git a/tests/mocks/api/github/graphql/base.field.mjs b/tests/mocks/api/github/graphql/base.field.mjs
index 422c6deb3b7..3208ce3e06f 100644
--- a/tests/mocks/api/github/graphql/base.field.mjs
+++ b/tests/mocks/api/github/graphql/base.field.mjs
@@ -3,16 +3,16 @@ export default function({faker, query, login = faker.internet.userName()}) {
   console.debug("metrics/compute/mocks > mocking graphql api result > base/user")
   return ({
     user: {
-      packages: {totalCount: faker.datatype.number(10)},
-      starredRepositories: {totalCount: faker.datatype.number(1000)},
-      watching: {totalCount: faker.datatype.number(100)},
-      sponsorshipsAsSponsor: {totalCount: faker.datatype.number(10)},
-      sponsorshipsAsMaintainer: {totalCount: faker.datatype.number(10)},
-      repositoriesContributedTo: {totalCount: faker.datatype.number(100)},
-      followers: {totalCount: faker.datatype.number(1000)},
-      following: {totalCount: faker.datatype.number(1000)},
-      issueComments: {totalCount: faker.datatype.number(1000)},
-      organizations: {totalCount: faker.datatype.number(10)},
+      packages: {totalCount: faker.number.int(10)},
+      starredRepositories: {totalCount: faker.number.int(1000)},
+      watching: {totalCount: faker.number.int(100)},
+      sponsorshipsAsSponsor: {totalCount: faker.number.int(10)},
+      sponsorshipsAsMaintainer: {totalCount: faker.number.int(10)},
+      repositoriesContributedTo: {totalCount: faker.number.int(100)},
+      followers: {totalCount: faker.number.int(1000)},
+      following: {totalCount: faker.number.int(1000)},
+      issueComments: {totalCount: faker.number.int(1000)},
+      organizations: {totalCount: faker.number.int(10)},
     },
   })
 }
diff --git a/tests/mocks/api/github/graphql/base.field.repositories.mjs b/tests/mocks/api/github/graphql/base.field.repositories.mjs
index 102aca3c442..8ba15ac4465 100644
--- a/tests/mocks/api/github/graphql/base.field.repositories.mjs
+++ b/tests/mocks/api/github/graphql/base.field.repositories.mjs
@@ -3,7 +3,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
   console.debug("metrics/compute/mocks > mocking graphql api result > base/user")
   return ({
     user: {
-      repositories: {totalCount: faker.datatype.number(100), totalDiskUsage: faker.datatype.number(100000)},
+      repositories: {totalCount: faker.number.int(100), totalDiskUsage: faker.number.int(100000)},
     },
   })
 }
diff --git a/tests/mocks/api/github/graphql/base.repositories.mjs b/tests/mocks/api/github/graphql/base.repositories.mjs
index a60fa333fa6..445c93b38cb 100644
--- a/tests/mocks/api/github/graphql/base.repositories.mjs
+++ b/tests/mocks/api/github/graphql/base.repositories.mjs
@@ -26,31 +26,31 @@ export default function({faker, query, login = faker.internet.userName()}) {
           ],
           nodes: [
             {
-              name: faker.random.words(),
-              watchers: {totalCount: faker.datatype.number(1000)},
-              stargazers: {totalCount: faker.datatype.number(10000)},
+              name: faker.lorem.words(),
+              watchers: {totalCount: faker.number.int(1000)},
+              stargazers: {totalCount: faker.number.int(10000)},
               owner: {login},
               languages: {
                 edges: [
-                  {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-                  {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-                  {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-                  {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-                  {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-                  {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-                  {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+                  {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+                  {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+                  {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+                  {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+                  {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+                  {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+                  {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
                 ],
               },
-              issues_open: {totalCount: faker.datatype.number(100)},
-              issues_closed: {totalCount: faker.datatype.number(100)},
-              pr_open: {totalCount: faker.datatype.number(100)},
-              pr_closed: {totalCount: faker.datatype.number(100)},
-              pr_merged: {totalCount: faker.datatype.number(100)},
-              releases: {totalCount: faker.datatype.number(100)},
-              forkCount: faker.datatype.number(100),
+              issues_open: {totalCount: faker.number.int(100)},
+              issues_closed: {totalCount: faker.number.int(100)},
+              pr_open: {totalCount: faker.number.int(100)},
+              pr_closed: {totalCount: faker.number.int(100)},
+              pr_merged: {totalCount: faker.number.int(100)},
+              releases: {totalCount: faker.number.int(100)},
+              forkCount: faker.number.int(100),
               licenseInfo: {spdxId: "MIT"},
-              deployments: {totalCount: faker.datatype.number(100)},
-              environments: {totalCount: faker.datatype.number(100)},
+              deployments: {totalCount: faker.number.int(100)},
+              environments: {totalCount: faker.number.int(100)},
             },
           ],
         },
diff --git a/tests/mocks/api/github/graphql/base.repository.mjs b/tests/mocks/api/github/graphql/base.repository.mjs
index 35ad686bf8e..dd2503beb82 100644
--- a/tests/mocks/api/github/graphql/base.repository.mjs
+++ b/tests/mocks/api/github/graphql/base.repository.mjs
@@ -9,29 +9,29 @@ export default function({faker, query, login = faker.internet.userName()}) {
         createdAt: new Date().toISOString(),
         diskUsage: Math.floor(Math.random() * 10000),
         homepageUrl: faker.internet.url(),
-        watchers: {totalCount: faker.datatype.number(1000)},
-        stargazers: {totalCount: faker.datatype.number(10000)},
+        watchers: {totalCount: faker.number.int(1000)},
+        stargazers: {totalCount: faker.number.int(10000)},
         languages: {
           edges: [
-            {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-            {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-            {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-            {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-            {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-            {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
-            {size: faker.datatype.number(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+            {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+            {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+            {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+            {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+            {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+            {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
+            {size: faker.number.int(100000), node: {color: faker.internet.color(), name: faker.lorem.word()}},
           ],
         },
-        issues_open: {totalCount: faker.datatype.number(100)},
-        issues_closed: {totalCount: faker.datatype.number(100)},
-        pr_open: {totalCount: faker.datatype.number(100)},
-        pr_closed: {totalCount: faker.datatype.number(100)},
-        pr_merged: {totalCount: faker.datatype.number(100)},
-        releases: {totalCount: faker.datatype.number(100)},
-        forkCount: faker.datatype.number(100),
+        issues_open: {totalCount: faker.number.int(100)},
+        issues_closed: {totalCount: faker.number.int(100)},
+        pr_open: {totalCount: faker.number.int(100)},
+        pr_closed: {totalCount: faker.number.int(100)},
+        pr_merged: {totalCount: faker.number.int(100)},
+        releases: {totalCount: faker.number.int(100)},
+        forkCount: faker.number.int(100),
         licenseInfo: {spdxId: "MIT"},
-        deployments: {totalCount: faker.datatype.number(100)},
-        environments: {totalCount: faker.datatype.number(100)},
+        deployments: {totalCount: faker.number.int(100)},
+        environments: {totalCount: faker.number.int(100)},
       },
     },
   })
diff --git a/tests/mocks/api/github/graphql/base.user.mjs b/tests/mocks/api/github/graphql/base.user.mjs
index 208155526ad..fcc01f0c687 100644
--- a/tests/mocks/api/github/graphql/base.user.mjs
+++ b/tests/mocks/api/github/graphql/base.user.mjs
@@ -3,11 +3,11 @@ export default function({faker, query, login = faker.internet.userName()}) {
   console.debug("metrics/compute/mocks > mocking graphql api result > base/user")
   return ({
     user: {
-      databaseId: faker.datatype.number(10000000),
-      name: faker.name.fullName(),
+      databaseId: faker.number.int(10000000),
+      name: faker.person.fullName(),
       login,
-      createdAt: `${faker.date.past(10)}`,
-      avatarUrl: faker.image.people(),
+      createdAt: `${faker.date.past({years:10})}`,
+      avatarUrl: faker.image.urlLoremFlickr({ category: 'people' }),
       websiteUrl: faker.internet.url(),
       twitterUsername: login,
     },
diff --git a/tests/mocks/api/github/graphql/calendar.default.mjs b/tests/mocks/api/github/graphql/calendar.default.mjs
index 716db281c5a..10111fd8357 100644
--- a/tests/mocks/api/github/graphql/calendar.default.mjs
+++ b/tests/mocks/api/github/graphql/calendar.default.mjs
@@ -13,7 +13,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
       contributionDays = []
     }
     //Random contributions
-    const contributionCount = Math.min(10, Math.max(0, faker.datatype.number(14) - 4))
+    const contributionCount = Math.min(10, Math.max(0, faker.number.int(14) - 4))
     contributionDays.push({
       contributionCount,
       color: ["#ebedf0", "#9be9a8", "#40c463", "#30a14e", "#216e39"][Math.ceil(contributionCount / 10 / 0.25)],
diff --git a/tests/mocks/api/github/graphql/discussions.comments.mjs b/tests/mocks/api/github/graphql/discussions.comments.mjs
index f37de6d986c..236f2ef2486 100644
--- a/tests/mocks/api/github/graphql/discussions.comments.mjs
+++ b/tests/mocks/api/github/graphql/discussions.comments.mjs
@@ -14,7 +14,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
       user: {
         repositoryDiscussionsComments: {
           edges: new Array(100).fill(null).map(_ => ({cursor: "MOCKED_CURSOR"})),
-          nodes: new Array(100).fill(null).map(_ => ({upvoteCount: faker.datatype.number(10)})),
+          nodes: new Array(100).fill(null).map(_ => ({upvoteCount: faker.number.int(10)})),
         },
       },
     })
diff --git a/tests/mocks/api/github/graphql/discussions.statistics.mjs b/tests/mocks/api/github/graphql/discussions.statistics.mjs
index 0a35cc0fea0..d0c924611c1 100644
--- a/tests/mocks/api/github/graphql/discussions.statistics.mjs
+++ b/tests/mocks/api/github/graphql/discussions.statistics.mjs
@@ -3,9 +3,9 @@ export default function({faker, query, login = faker.internet.userName()}) {
   console.debug("metrics/compute/mocks > mocking graphql api result > discussions/statistics")
   return ({
     user: {
-      started: {totalCount: faker.datatype.number(1000)},
-      comments: {totalCount: faker.datatype.number(1000)},
-      answers: {totalCount: faker.datatype.number(1000)},
+      started: {totalCount: faker.number.int(1000)},
+      comments: {totalCount: faker.number.int(1000)},
+      answers: {totalCount: faker.number.int(1000)},
     },
   })
 }
diff --git a/tests/mocks/api/github/graphql/followup.repository.mjs b/tests/mocks/api/github/graphql/followup.repository.mjs
index 658ae7bad28..09837e2447f 100644
--- a/tests/mocks/api/github/graphql/followup.repository.mjs
+++ b/tests/mocks/api/github/graphql/followup.repository.mjs
@@ -2,13 +2,13 @@
 export default function({faker, query, login = faker.internet.userName()}) {
   console.debug("metrics/compute/mocks > mocking graphql api result > followup/repository")
   return ({
-    issues_open: {issueCount: faker.datatype.number(100)},
-    issues_drafts: {issueCount: faker.datatype.number(100)},
-    issues_skipped: {issueCount: faker.datatype.number(100)},
-    issues_closed: {issueCount: faker.datatype.number(100)},
-    pr_open: {issueCount: faker.datatype.number(100)},
-    pr_drafts: {issueCount: faker.datatype.number(100)},
-    pr_closed: {issueCount: faker.datatype.number(100)},
-    pr_merged: {issueCount: faker.datatype.number(100)},
+    issues_open: {issueCount: faker.number.int(100)},
+    issues_drafts: {issueCount: faker.number.int(100)},
+    issues_skipped: {issueCount: faker.number.int(100)},
+    issues_closed: {issueCount: faker.number.int(100)},
+    pr_open: {issueCount: faker.number.int(100)},
+    pr_drafts: {issueCount: faker.number.int(100)},
+    pr_closed: {issueCount: faker.number.int(100)},
+    pr_merged: {issueCount: faker.number.int(100)},
   })
 }
diff --git a/tests/mocks/api/github/graphql/followup.user.mjs b/tests/mocks/api/github/graphql/followup.user.mjs
index dbc4967faff..c6c206bf674 100644
--- a/tests/mocks/api/github/graphql/followup.user.mjs
+++ b/tests/mocks/api/github/graphql/followup.user.mjs
@@ -2,13 +2,13 @@
 export default function({faker, query, login = faker.internet.userName()}) {
   console.debug("metrics/compute/mocks > mocking graphql api result > followup/user")
   return ({
-    issues_open: {issueCount: faker.datatype.number(100)},
-    issues_drafts: {issueCount: faker.datatype.number(100)},
-    issues_skipped: {issueCount: faker.datatype.number(100)},
-    issues_closed: {issueCount: faker.datatype.number(100)},
-    pr_open: {issueCount: faker.datatype.number(100)},
-    pr_drafts: {issueCount: faker.datatype.number(100)},
-    pr_closed: {issueCount: faker.datatype.number(100)},
-    pr_merged: {issueCount: faker.datatype.number(100)},
+    issues_open: {issueCount: faker.number.int(100)},
+    issues_drafts: {issueCount: faker.number.int(100)},
+    issues_skipped: {issueCount: faker.number.int(100)},
+    issues_closed: {issueCount: faker.number.int(100)},
+    pr_open: {issueCount: faker.number.int(100)},
+    pr_drafts: {issueCount: faker.number.int(100)},
+    pr_closed: {issueCount: faker.number.int(100)},
+    pr_merged: {issueCount: faker.number.int(100)},
   })
 }
diff --git a/tests/mocks/api/github/graphql/gists.default.mjs b/tests/mocks/api/github/graphql/gists.default.mjs
index c6654a1ec49..c55fde09170 100644
--- a/tests/mocks/api/github/graphql/gists.default.mjs
+++ b/tests/mocks/api/github/graphql/gists.default.mjs
@@ -18,21 +18,21 @@ export default function({faker, query, login = faker.internet.userName()}) {
               cursor: "MOCKED_CURSOR",
             },
           ],
-          totalCount: faker.datatype.number(100),
+          totalCount: faker.number.int(100),
           nodes: [
             {
-              stargazerCount: faker.datatype.number(10),
+              stargazerCount: faker.number.int(10),
               isFork: false,
-              forks: {totalCount: faker.datatype.number(10)},
+              forks: {totalCount: faker.number.int(10)},
               files: [{name: faker.system.fileName()}],
-              comments: {totalCount: faker.datatype.number(10)},
+              comments: {totalCount: faker.number.int(10)},
             },
             {
-              stargazerCount: faker.datatype.number(10),
+              stargazerCount: faker.number.int(10),
               isFork: false,
-              forks: {totalCount: faker.datatype.number(10)},
+              forks: {totalCount: faker.number.int(10)},
               files: [{name: faker.system.fileName()}],
-              comments: {totalCount: faker.datatype.number(10)},
+              comments: {totalCount: faker.number.int(10)},
             },
           ],
         },
diff --git a/tests/mocks/api/github/graphql/isocalendar.calendar.mjs b/tests/mocks/api/github/graphql/isocalendar.calendar.mjs
index 97c8c3b1959..2defd15cbaf 100644
--- a/tests/mocks/api/github/graphql/isocalendar.calendar.mjs
+++ b/tests/mocks/api/github/graphql/isocalendar.calendar.mjs
@@ -13,7 +13,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
       contributionDays = []
     }
     //Random contributions
-    const contributionCount = Math.min(10, Math.max(0, faker.datatype.number(14) - 4))
+    const contributionCount = Math.min(10, Math.max(0, faker.number.int(14) - 4))
     contributionDays.push({
       contributionCount,
       color: ["#ebedf0", "#9be9a8", "#40c463", "#30a14e", "#216e39"][Math.ceil(contributionCount / 10 / 0.25)],
diff --git a/tests/mocks/api/github/graphql/notable.contributions.mjs b/tests/mocks/api/github/graphql/notable.contributions.mjs
index a296fc2cec7..184075d00a6 100644
--- a/tests/mocks/api/github/graphql/notable.contributions.mjs
+++ b/tests/mocks/api/github/graphql/notable.contributions.mjs
@@ -22,11 +22,11 @@ export default function({faker, query, login = faker.internet.userName()}) {
                   avatarUrl: null,
                 },
                 nameWithOwner: `${faker.internet.userName()}/${faker.lorem.slug()}`,
-                stargazers: {totalCount: faker.datatype.number(1000)},
-                watchers: {totalCount: faker.datatype.number(1000)},
-                forks: {totalCount: faker.datatype.number(1000)},
-                issues: {totalCount: faker.datatype.number(1000)},
-                pullRequests: {totalCount: faker.datatype.number(1000)},
+                stargazers: {totalCount: faker.number.int(1000)},
+                watchers: {totalCount: faker.number.int(1000)},
+                forks: {totalCount: faker.number.int(1000)},
+                issues: {totalCount: faker.number.int(1000)},
+                pullRequests: {totalCount: faker.number.int(1000)},
               },
             },
           ],
diff --git a/tests/mocks/api/github/graphql/notable.issues.mjs b/tests/mocks/api/github/graphql/notable.issues.mjs
index ccf650a6501..d4b683d51d2 100644
--- a/tests/mocks/api/github/graphql/notable.issues.mjs
+++ b/tests/mocks/api/github/graphql/notable.issues.mjs
@@ -15,7 +15,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
     : ({
       user: {
         issues: {
-          totalCount: faker.datatype.number(1000),
+          totalCount: faker.number.int(1000),
           edges: [
             {
               cursor: "MOCKED_CURSOR",
diff --git a/tests/mocks/api/github/graphql/projects.repository.legacy.mjs b/tests/mocks/api/github/graphql/projects.repository.legacy.mjs
index 3bfc196b207..cff1bde9dea 100644
--- a/tests/mocks/api/github/graphql/projects.repository.legacy.mjs
+++ b/tests/mocks/api/github/graphql/projects.repository.legacy.mjs
@@ -9,9 +9,9 @@ export default function({faker, query, login = faker.internet.userName()}) {
           updatedAt: `${faker.date.recent()}`,
           body: faker.lorem.paragraph(),
           progress: {
-            doneCount: faker.datatype.number(10),
-            inProgressCount: faker.datatype.number(10),
-            todoCount: faker.datatype.number(10),
+            doneCount: faker.number.int(10),
+            inProgressCount: faker.number.int(10),
+            todoCount: faker.number.int(10),
             enabled: true,
           },
         },
diff --git a/tests/mocks/api/github/graphql/projects.repository.mjs b/tests/mocks/api/github/graphql/projects.repository.mjs
index 8666a36007d..7642ade8fe9 100644
--- a/tests/mocks/api/github/graphql/projects.repository.mjs
+++ b/tests/mocks/api/github/graphql/projects.repository.mjs
@@ -12,7 +12,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
             get totalCount() {
               return this.nodes.length
             },
-            nodes: new Array(faker.datatype.number(10)).fill(null).map(() => ({type: faker.helpers.arrayElement(["DRAFT_ISSUE", "ISSUE", "PULL_REQUEST", "REDACTED"]), fieldValues: {nodes: [{text: faker.lorem.sentence()}]}})),
+            nodes: new Array(faker.number.int(10)).fill(null).map(() => ({type: faker.helpers.arrayElement(["DRAFT_ISSUE", "ISSUE", "PULL_REQUEST", "REDACTED"]), fieldValues: {nodes: [{text: faker.lorem.sentence()}]}})),
           },
         },
       },
diff --git a/tests/mocks/api/github/graphql/projects.user.legacy.mjs b/tests/mocks/api/github/graphql/projects.user.legacy.mjs
index 4f6c86d7c96..add6638b6c6 100644
--- a/tests/mocks/api/github/graphql/projects.user.legacy.mjs
+++ b/tests/mocks/api/github/graphql/projects.user.legacy.mjs
@@ -11,9 +11,9 @@ export default function({faker, query, login = faker.internet.userName()}) {
             updatedAt: `${faker.date.recent()}`,
             body: faker.lorem.paragraph(),
             progress: {
-              doneCount: faker.datatype.number(10),
-              inProgressCount: faker.datatype.number(10),
-              todoCount: faker.datatype.number(10),
+              doneCount: faker.number.int(10),
+              inProgressCount: faker.number.int(10),
+              todoCount: faker.number.int(10),
               enabled: true,
             },
           },
diff --git a/tests/mocks/api/github/graphql/projects.user.mjs b/tests/mocks/api/github/graphql/projects.user.mjs
index 53496eb9b80..a554a396871 100644
--- a/tests/mocks/api/github/graphql/projects.user.mjs
+++ b/tests/mocks/api/github/graphql/projects.user.mjs
@@ -14,7 +14,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
               get totalCount() {
                 return this.nodes.length
               },
-              nodes: new Array(faker.datatype.number(10)).fill(null).map(() => ({type: faker.helpers.arrayElement(["DRAFT_ISSUE", "ISSUE", "PULL_REQUEST", "REDACTED"]), fieldValues: {nodes: [{text: faker.lorem.sentence()}]}})),
+              nodes: new Array(faker.number.int(10)).fill(null).map(() => ({type: faker.helpers.arrayElement(["DRAFT_ISSUE", "ISSUE", "PULL_REQUEST", "REDACTED"]), fieldValues: {nodes: [{text: faker.lorem.sentence()}]}})),
             },
           },
         ],
diff --git a/tests/mocks/api/github/graphql/repositories.pinned.mjs b/tests/mocks/api/github/graphql/repositories.pinned.mjs
index 316bdb66d5b..5415c0ef22f 100644
--- a/tests/mocks/api/github/graphql/repositories.pinned.mjs
+++ b/tests/mocks/api/github/graphql/repositories.pinned.mjs
@@ -8,17 +8,17 @@ export default function({faker, query, login = faker.internet.userName()}) {
           node: {
             createdAt: faker.date.past(),
             description: "📊 An image generator with 20+ metrics about your GitHub account such as activity, community, repositories, coding habits, website performances, music played, starred topics, etc. that you can put on your profile or elsewhere !",
-            forkCount: faker.datatype.number(100),
+            forkCount: faker.number.int(100),
             isFork: false,
             issues: {
-              totalCount: faker.datatype.number(100),
+              totalCount: faker.number.int(100),
             },
             nameWithOwner: "lowlighter/metrics",
             openGraphImageUrl: "https://repository-images.githubusercontent.com/293860197/7fd72080-496d-11eb-8fe0-238b38a0746a",
             pullRequests: {
-              totalCount: faker.datatype.number(100),
+              totalCount: faker.number.int(100),
             },
-            stargazerCount: faker.datatype.number(10000),
+            stargazerCount: faker.number.int(10000),
             licenseInfo: {
               nickname: null,
               name: "MIT License",
diff --git a/tests/mocks/api/github/graphql/repositories.repository.mjs b/tests/mocks/api/github/graphql/repositories.repository.mjs
index 3710b6708ff..973887503e3 100644
--- a/tests/mocks/api/github/graphql/repositories.repository.mjs
+++ b/tests/mocks/api/github/graphql/repositories.repository.mjs
@@ -5,17 +5,17 @@ export default function({faker, query, login = faker.internet.userName()}) {
     repository: {
       createdAt: faker.date.past(),
       description: "📊 An image generator with 20+ metrics about your GitHub account such as activity, community, repositories, coding habits, website performances, music played, starred topics, etc. that you can put on your profile or elsewhere !",
-      forkCount: faker.datatype.number(100),
+      forkCount: faker.number.int(100),
       isFork: false,
       issues: {
-        totalCount: faker.datatype.number(100),
+        totalCount: faker.number.int(100),
       },
       nameWithOwner: "lowlighter/metrics",
       openGraphImageUrl: "https://repository-images.githubusercontent.com/293860197/7fd72080-496d-11eb-8fe0-238b38a0746a",
       pullRequests: {
-        totalCount: faker.datatype.number(100),
+        totalCount: faker.number.int(100),
       },
-      stargazerCount: faker.datatype.number(10000),
+      stargazerCount: faker.number.int(10000),
       licenseInfo: {
         nickname: null,
         name: "MIT License",
diff --git a/tests/mocks/api/github/graphql/sponsors.active.mjs b/tests/mocks/api/github/graphql/sponsors.active.mjs
index aabb06487df..d3022c2fb60 100644
--- a/tests/mocks/api/github/graphql/sponsors.active.mjs
+++ b/tests/mocks/api/github/graphql/sponsors.active.mjs
@@ -21,7 +21,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
               avatarUrl: null,
             },
             tier: {
-              monthlyPriceInDollars: faker.datatype.number(10),
+              monthlyPriceInDollars: faker.number.int(10),
             },
           })),
         },
diff --git a/tests/mocks/api/github/graphql/sponsors.all.mjs b/tests/mocks/api/github/graphql/sponsors.all.mjs
index bfb39455d54..feca75eec73 100644
--- a/tests/mocks/api/github/graphql/sponsors.all.mjs
+++ b/tests/mocks/api/github/graphql/sponsors.all.mjs
@@ -20,7 +20,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
               avatarUrl: null,
             },
             sponsorsTier: {
-              monthlyPriceInDollars: faker.datatype.number(10),
+              monthlyPriceInDollars: faker.number.int(10),
             },
           })),
         },
diff --git a/tests/mocks/api/github/graphql/sponsors.description.mjs b/tests/mocks/api/github/graphql/sponsors.description.mjs
index f4de814bab7..0e41a081eb7 100644
--- a/tests/mocks/api/github/graphql/sponsors.description.mjs
+++ b/tests/mocks/api/github/graphql/sponsors.description.mjs
@@ -6,7 +6,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
       sponsorsListing: {
         fullDescription: faker.lorem.sentences(),
         activeGoal: {
-          percentComplete: faker.datatype.number(100),
+          percentComplete: faker.number.int(100),
           title: faker.lorem.sentence(),
           description: faker.lorem.sentence(),
         },
diff --git a/tests/mocks/api/github/graphql/sponsorships.default.mjs b/tests/mocks/api/github/graphql/sponsorships.default.mjs
index 1187d6bf68d..d7fbd6aee6f 100644
--- a/tests/mocks/api/github/graphql/sponsorships.default.mjs
+++ b/tests/mocks/api/github/graphql/sponsorships.default.mjs
@@ -3,7 +3,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
   console.debug("metrics/compute/mocks > mocking graphql api result > sponsorships/default")
   return ({
     user: {
-      totalSponsorshipAmountAsSponsorInCents: faker.datatype.number(100000),
+      totalSponsorshipAmountAsSponsorInCents: faker.number.int(100000),
       sponsorshipsAsSponsor: {
         nodes: [{createdAt: `${faker.date.recent()}`}],
       },
diff --git a/tests/mocks/api/github/graphql/stargazers.default.mjs b/tests/mocks/api/github/graphql/stargazers.default.mjs
index d8af14884f4..d3a98f96255 100644
--- a/tests/mocks/api/github/graphql/stargazers.default.mjs
+++ b/tests/mocks/api/github/graphql/stargazers.default.mjs
@@ -12,11 +12,11 @@ export default function({faker, query, login = faker.internet.userName()}) {
     : ({
       repository: {
         stargazers: {
-          edges: new Array(faker.datatype.number({min: 50, max: 100})).fill(null).map(() => ({
-            starredAt: `${faker.date.recent(30)}`,
+          edges: new Array(faker.number.int({min: 50, max: 100})).fill(null).map(() => ({
+            starredAt: `${faker.date.recent({days:30})}`,
             cursor: "MOCKED_CURSOR",
             node: {
-              location: faker.address.city(),
+              location: faker.location.city(),
             },
           })),
         },
diff --git a/tests/mocks/api/github/graphql/stars.default.mjs b/tests/mocks/api/github/graphql/stars.default.mjs
index cfcc5e12f6b..4ee8e37db03 100644
--- a/tests/mocks/api/github/graphql/stars.default.mjs
+++ b/tests/mocks/api/github/graphql/stars.default.mjs
@@ -6,20 +6,20 @@ export default function({faker, query, login = faker.internet.userName()}) {
       starredRepositories: {
         edges: [
           {
-            starredAt: `${faker.date.recent(14)}`,
+            starredAt: `${faker.date.recent({days:14})}`,
             node: {
               description: "📊 An image generator with 20+ metrics about your GitHub account such as activity, community, repositories, coding habits, website performances, music played, starred topics, etc. that you can put on your profile or elsewhere !",
-              forkCount: faker.datatype.number(100),
+              forkCount: faker.number.int(100),
               isFork: false,
               issues: {
-                totalCount: faker.datatype.number(100),
+                totalCount: faker.number.int(100),
               },
               nameWithOwner: "lowlighter/metrics",
               openGraphImageUrl: "https://repository-images.githubusercontent.com/293860197/7fd72080-496d-11eb-8fe0-238b38a0746a",
               pullRequests: {
-                totalCount: faker.datatype.number(100),
+                totalCount: faker.number.int(100),
               },
-              stargazerCount: faker.datatype.number(10000),
+              stargazerCount: faker.number.int(10000),
               licenseInfo: {
                 nickname: null,
                 name: "MIT License",
diff --git a/tests/mocks/api/github/rest/activity/listEventsForAuthenticatedUser.mjs b/tests/mocks/api/github/rest/activity/listEventsForAuthenticatedUser.mjs
index 39b38735927..add7f1dc5d8 100644
--- a/tests/mocks/api/github/rest/activity/listEventsForAuthenticatedUser.mjs
+++ b/tests/mocks/api/github/rest/activity/listEventsForAuthenticatedUser.mjs
@@ -17,7 +17,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           comment: {
@@ -29,7 +29,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             body: faker.lorem.sentence(),
           },
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -39,7 +39,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           action: "created",
@@ -58,7 +58,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             body: "",
           },
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -68,7 +68,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           action: faker.helpers.arrayElement(["opened", "closed", "reopened"]),
@@ -82,7 +82,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             performed_via_github_app: null,
           },
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -92,7 +92,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           pages: [
@@ -105,7 +105,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             },
           ],
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -115,7 +115,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           action: "created",
@@ -138,7 +138,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             performed_via_github_app: null,
           },
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -148,15 +148,15 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           forkee: {
-            name: faker.random.word(),
-            full_name: `${faker.random.word()}/${faker.random.word()}`,
+            name: faker.lorem.word(),
+            full_name: `${faker.lorem.word()}/${faker.lorem.word()}`,
           },
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -166,7 +166,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           action: "created",
@@ -186,7 +186,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             },
           },
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -196,18 +196,18 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           action: "published",
           release: {
-            tag_name: `v${faker.datatype.number()}.${faker.datatype.number()}`,
-            name: faker.random.words(4),
+            tag_name: `v${faker.number.int()}.${faker.number.int()}`,
+            name: faker.lorem.words(4),
             draft: faker.datatype.boolean(),
             prerelease: faker.datatype.boolean(),
           },
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -217,14 +217,14 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           ref: faker.lorem.slug(),
           ref_type: faker.helpers.arrayElement(["tag", "branch"]),
           master_branch: "master",
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -237,7 +237,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           name: "lowlighter/metrics",
         },
         payload: {action: "started"},
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -247,13 +247,13 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           ref: faker.lorem.slug(),
           ref_type: faker.helpers.arrayElement(["tag", "branch"]),
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -263,7 +263,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           size: 1,
@@ -279,7 +279,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             },
           ],
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -289,7 +289,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           action: faker.helpers.arrayElement(["opened", "closed"]),
@@ -300,12 +300,12 @@ export default async function({faker}, target, that, [{username: login, page, pe
             },
             state: "open",
             title: faker.lorem.sentence(),
-            additions: faker.datatype.number(1000),
-            deletions: faker.datatype.number(1000),
-            changed_files: faker.datatype.number(10),
+            additions: faker.number.int(1000),
+            deletions: faker.number.int(1000),
+            changed_files: faker.number.int(10),
           },
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -315,7 +315,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {
           member: {
@@ -323,7 +323,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           },
           action: "added",
         },
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
       {
@@ -333,10 +333,10 @@ export default async function({faker}, target, that, [{username: login, page, pe
           login,
         },
         repo: {
-          name: `${faker.random.word()}/${faker.random.word()}`,
+          name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {},
-        created_at: faker.date.recent(7),
+        created_at: faker.date.recent({days:7}),
         public: true,
       },
     ],
diff --git a/tests/mocks/api/github/rest/repos/get.mjs b/tests/mocks/api/github/rest/repos/get.mjs
index e26d73b127f..b3fa071b341 100644
--- a/tests/mocks/api/github/rest/repos/get.mjs
+++ b/tests/mocks/api/github/rest/repos/get.mjs
@@ -10,13 +10,13 @@ export default async function({faker}, target, that, [{owner, repo}]) {
       "x-oauth-scopes": "repo",
     },
     data: {
-      id: faker.datatype.number(100000),
+      id: faker.number.int(100000),
       name: repo,
       full_name: `${owner}/${repo}`,
       private: false,
       owner: {
         login: owner,
-        id: faker.datatype.number(100000),
+        id: faker.number.int(100000),
       },
       description: faker.lorem.sentences(),
       created_at: faker.date.past(),
diff --git a/tests/mocks/api/github/rest/repos/getContributorsStats.mjs b/tests/mocks/api/github/rest/repos/getContributorsStats.mjs
index 89df465e2cd..237943a02ef 100644
--- a/tests/mocks/api/github/rest/repos/getContributorsStats.mjs
+++ b/tests/mocks/api/github/rest/repos/getContributorsStats.mjs
@@ -11,12 +11,12 @@ export default async function({faker}, target, that, [{owner, repo}]) {
     },
     data: [
       {
-        total: faker.datatype.number(10000),
+        total: faker.number.int(10000),
         weeks: [
-          {w: faker.date.recent(), a: faker.datatype.number(10000), d: faker.datatype.number(10000), c: faker.datatype.number(10000)},
-          {w: faker.date.recent(), a: faker.datatype.number(10000), d: faker.datatype.number(10000), c: faker.datatype.number(10000)},
-          {w: faker.date.recent(), a: faker.datatype.number(10000), d: faker.datatype.number(10000), c: faker.datatype.number(10000)},
-          {w: faker.date.recent(), a: faker.datatype.number(10000), d: faker.datatype.number(10000), c: faker.datatype.number(10000)},
+          {w: faker.date.recent(), a: faker.number.int(10000), d: faker.number.int(10000), c: faker.number.int(10000)},
+          {w: faker.date.recent(), a: faker.number.int(10000), d: faker.number.int(10000), c: faker.number.int(10000)},
+          {w: faker.date.recent(), a: faker.number.int(10000), d: faker.number.int(10000), c: faker.number.int(10000)},
+          {w: faker.date.recent(), a: faker.number.int(10000), d: faker.number.int(10000), c: faker.number.int(10000)},
         ].sort((a, b) => new Date(a.w) - new Date(b.w)),
         author: {
           login: owner,
diff --git a/tests/mocks/api/github/rest/repos/getViews.mjs b/tests/mocks/api/github/rest/repos/getViews.mjs
index 1ebab8434ad..e14835ea1bd 100644
--- a/tests/mocks/api/github/rest/repos/getViews.mjs
+++ b/tests/mocks/api/github/rest/repos/getViews.mjs
@@ -1,8 +1,8 @@
 /**Mocked data */
 export default async function({faker}, target, that, [{owner, repo}]) {
   console.debug("metrics/compute/mocks > mocking rest api result > rest.repos.getViews")
-  const count = faker.datatype.number(10000) * 2
-  const uniques = faker.datatype.number(count) * 2
+  const count = faker.number.int(10000) * 2
+  const uniques = faker.number.int(count) * 2
   return ({
     status: 200,
     url: `https://api.github.com/repos/${owner}/${repo}/traffic/views`,
diff --git a/tests/mocks/api/github/rest/repos/listCommits.mjs b/tests/mocks/api/github/rest/repos/listCommits.mjs
index 56e0ba87bfa..9523a89716e 100644
--- a/tests/mocks/api/github/rest/repos/listCommits.mjs
+++ b/tests/mocks/api/github/rest/repos/listCommits.mjs
@@ -21,13 +21,13 @@ export default async function({faker}, target, that, [{page, per_page, owner, re
             name: owner,
             login: faker.internet.userName(),
             avatar_url: null,
-            date: `${faker.date.recent(14)}`,
+            date: `${faker.date.recent({days:14})}`,
           },
           committer: {
             name: owner,
             login: faker.internet.userName(),
             avatar_url: null,
-            date: `${faker.date.recent(14)}`,
+            date: `${faker.date.recent({days:14})}`,
           },
         },
       }))
diff --git a/tests/mocks/api/github/rest/repos/listContributors.mjs b/tests/mocks/api/github/rest/repos/listContributors.mjs
index 43af376de66..c7f45b39a35 100644
--- a/tests/mocks/api/github/rest/repos/listContributors.mjs
+++ b/tests/mocks/api/github/rest/repos/listContributors.mjs
@@ -9,10 +9,10 @@ export default async function({faker}, target, that, [{owner, repo}]) {
       status: "200 OK",
       "x-oauth-scopes": "repo",
     },
-    data: new Array(40 + faker.datatype.number(60)).fill(null).map(() => ({
+    data: new Array(40 + faker.number.int(60)).fill(null).map(() => ({
       login: faker.internet.userName(),
       avatar_url: null,
-      contributions: faker.datatype.number(1000),
+      contributions: faker.number.int(1000),
     })),
   })
 }
diff --git a/tests/mocks/api/github/rest/request.mjs b/tests/mocks/api/github/rest/request.mjs
index 2335e3bff6c..83b1fb97d55 100644
--- a/tests/mocks/api/github/rest/request.mjs
+++ b/tests/mocks/api/github/rest/request.mjs
@@ -28,22 +28,22 @@ export default async function({faker}, target, that, args) {
           author: {
             name: faker.internet.userName(),
             email: faker.internet.email(),
-            date: `${faker.date.recent(7)}`,
+            date: `${faker.date.recent({days:7})}`,
           },
           committer: {
             name: faker.internet.userName(),
             email: faker.internet.email(),
-            date: `${faker.date.recent(7)}`,
+            date: `${faker.date.recent({days:7})}`,
           },
           url: "https://api.github.com/repos/lowlighter/metrics/commits/MOCKED_SHA",
         },
         author: {
           login: faker.internet.userName(),
-          id: faker.datatype.number(100000000),
+          id: faker.number.int(100000000),
         },
         committer: {
           login: faker.internet.userName(),
-          id: faker.datatype.number(100000000),
+          id: faker.number.int(100000000),
         },
         files: [
           {
diff --git a/tests/mocks/api/github/rest/users/getByUsername.mjs b/tests/mocks/api/github/rest/users/getByUsername.mjs
index f5b440ae08d..d7542a22eec 100644
--- a/tests/mocks/api/github/rest/users/getByUsername.mjs
+++ b/tests/mocks/api/github/rest/users/getByUsername.mjs
@@ -12,7 +12,7 @@ export default async function({faker}, target, that, [{username}]) {
     data: {
       login: faker.internet.userName(),
       avatar_url: null,
-      contributions: faker.datatype.number(1000),
+      contributions: faker.number.int(1000),
     },
   })
 }
diff --git a/tests/mocks/index.mjs b/tests/mocks/index.mjs
index b3b2ff055b8..67e34b9a42b 100644
--- a/tests/mocks/index.mjs
+++ b/tests/mocks/index.mjs
@@ -155,10 +155,10 @@ export default async function({graphql, rest}) {
     //Mock geocode API
     Gmap.prototype.geocode = function() {
       console.debug("metrics/compute/mocks > mocking google maps geocode result")
-      const lat = faker.address.latitude()
-      const lng = faker.address.longitude()
-      const city = faker.address.city()
-      const country = faker.address.country()
+      const lat = faker.location.latitude()
+      const lng = faker.location.longitude()
+      const city = faker.location.city()
+      const country = faker.location.country()
       return {
         data: {
           results: [
@@ -171,7 +171,7 @@ export default async function({graphql, rest}) {
                 },
                 {
                   long_name: country,
-                  short_name: faker.address.countryCode(),
+                  short_name: faker.location.countryCode(),
                   types: ["country", "political"],
                 },
               ],

From 0304c5946ed5d2fb1d2b69141d508dea5b1e2457 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 24 Jul 2023 21:10:09 -0400
Subject: [PATCH 138/196] Update allow.txt

---
 .github/actions/spelling/allow.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index 538a712fc0c..ca6de05723c 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -5,6 +5,7 @@ appdetails
 appids
 appinfo
 deno
+Flickr
 gpgarmor
 github
 githubassets

From 1a95c68e696cffa3c80eb15036707c39a58d2e62 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 24 Jul 2023 21:11:48 -0400
Subject: [PATCH 139/196] Update app.placeholder.js

---
 source/app/web/statics/embed/app.placeholder.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/app/web/statics/embed/app.placeholder.js b/source/app/web/statics/embed/app.placeholder.js
index 16523022172..4018f332434 100644
--- a/source/app/web/statics/embed/app.placeholder.js
+++ b/source/app/web/statics/embed/app.placeholder.js
@@ -881,7 +881,7 @@
           ? ({
             repositories: {
               list: new Array(Number(options["repositories.featured"].split(",").map(x => x.trim()).length)).fill(null).map((_, i) => ({
-                created: (),
+                created: faker.date.past(),
                 description: faker.lorem.sentence(),
                 forkCount: faker.number.int(100),
                 isFork: faker.datatype.boolean(),

From cea9e4307e4a7454e65f2ff7d46b469d3adc26f1 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 24 Jul 2023 21:37:34 -0400
Subject: [PATCH 140/196] fix(plugins/community/splatoon): upgrade s3si version

---
 source/plugins/community/splatoon/index.mjs   |   2 +-
 .../plugins/community/splatoon/s3si/index.ts  | 368 +++++++++++++-----
 2 files changed, 280 insertions(+), 90 deletions(-)

diff --git a/source/plugins/community/splatoon/index.mjs b/source/plugins/community/splatoon/index.mjs
index 144edcfa129..3daa34eb2ce 100644
--- a/source/plugins/community/splatoon/index.mjs
+++ b/source/plugins/community/splatoon/index.mjs
@@ -216,7 +216,7 @@ export default async function({login, q, imports, data, account}, {enabled = fal
               icon: await imports.imgb64(assets.stages[data.detail.coopStage.name]),
             },
             date: data.detail.playedTime,
-            grade: data.detail.afterGrade.name,
+            grade: data.detail.afterGrade?.name ?? "",
           })),
         ),
       }
diff --git a/source/plugins/community/splatoon/s3si/index.ts b/source/plugins/community/splatoon/s3si/index.ts
index f2b37097b65..2fe6c860a95 100644
--- a/source/plugins/community/splatoon/s3si/index.ts
+++ b/source/plugins/community/splatoon/s3si/index.ts
@@ -12,9 +12,26 @@ class APIError extends Error {
     }
 }
 const AGENT_NAME = "s3si.ts";
-const S3SI_VERSION = "0.3.1";
-const NSOAPP_VERSION = "2.5.0";
-const WEB_VIEW_VERSION = "3.0.0-2857bc50";
+const S3SI_VERSION = "0.4.5";
+const NSOAPP_VERSION = "2.6.0";
+const WEB_VIEW_VERSION = "4.0.0-d5178440";
+var Queries;
+(function(Queries) {
+    Queries["HomeQuery"] = "7dcc64ea27a08e70919893a0d3f70871";
+    Queries["LatestBattleHistoriesQuery"] = "0d90c7576f1916469b2ae69f64292c02";
+    Queries["RegularBattleHistoriesQuery"] = "3baef04b095ad8975ea679d722bc17de";
+    Queries["BankaraBattleHistoriesQuery"] = "0438ea6978ae8bd77c5d1250f4f84803";
+    Queries["XBattleHistoriesQuery"] = "6796e3cd5dc3ebd51864dc709d899fc5";
+    Queries["EventBattleHistoriesQuery"] = "9744fcf676441873c7c8a51285b6aa4d";
+    Queries["PrivateBattleHistoriesQuery"] = "8e5ae78b194264a6c230e262d069bd28";
+    Queries["VsHistoryDetailQuery"] = "9ee0099fbe3d8db2a838a75cf42856dd";
+    Queries["CoopHistoryQuery"] = "91b917becd2fa415890f5b47e15ffb15";
+    Queries["CoopHistoryDetailQuery"] = "379f0d9b78b531be53044bcac031b34b";
+    Queries["myOutfitCommonDataFilteringConditionQuery"] = "d02ab22c9dccc440076055c8baa0fa7a";
+    Queries["myOutfitCommonDataEquipmentsQuery"] = "d29cd0c2b5e6bac90dd5b817914832f8";
+    Queries["HistoryRecordQuery"] = "d9246baf077b2a29b5f7aac321810a77";
+    Queries["ConfigureAnalyticsQuery"] = "f8ae00773cc412a50dd41a6d9a159ddd";
+})(Queries || (Queries = {}));
 const S3SI_LINK = "https://github.com/spacemeowx2/s3si.ts";
 const USERAGENT = `${AGENT_NAME}/${S3SI_VERSION} (${S3SI_LINK})`;
 const DEFAULT_APP_USER_AGENT = "Mozilla/5.0 (Linux; Android 11; Pixel 5) " + "AppleWebKit/537.36 (KHTML, like Gecko) " + "Chrome/94.0.4606.61 Mobile Safari/537.36";
@@ -1243,13 +1260,13 @@ const MIN_BUF_SIZE = 16;
 const CR = "\r".charCodeAt(0);
 const LF = "\n".charCodeAt(0);
 class BufferFullError extends Error {
+    partial;
     name;
     constructor(partial){
         super("Buffer full");
         this.partial = partial;
         this.name = "BufferFullError";
     }
-    partial;
 }
 class PartialReadError extends Error {
     name = "PartialReadError";
@@ -1753,6 +1770,8 @@ class MultiReader {
     }
 }
 class LimitedReader {
+    reader;
+    limit;
     constructor(reader, limit){
         this.reader = reader;
         this.limit = limit;
@@ -1771,8 +1790,6 @@ class LimitedReader {
         this.limit -= n;
         return n;
     }
-    reader;
-    limit;
 }
 const DEFAULT_BUFFER_SIZE = 32 * 1024;
 async function copyN(r, dest, size) {
@@ -1836,6 +1853,7 @@ function sliceLongToBytes(d, dest = Array.from({
 }
 const decoder = new TextDecoder();
 class StringWriter {
+    base;
     #chunks;
     #byteLength;
     #cache;
@@ -1869,7 +1887,6 @@ class StringWriter {
         this.#cache = decoder.decode(buf);
         return this.#cache;
     }
-    base;
 }
 const mod2 = {
     copyN: copyN,
@@ -2144,12 +2161,12 @@ function utf8DecodeTD(bytes, inputOffset, byteLength) {
     return sharedTextDecoder.decode(stringBytes);
 }
 class ExtData {
+    type;
+    data;
     constructor(type, data){
         this.type = type;
         this.data = data;
     }
-    type;
-    data;
 }
 function setUint64(view, offset, value) {
     const high = value / 0x1_0000_0000;
@@ -2336,6 +2353,13 @@ function createDataView(buffer) {
     return new DataView(bufferView.buffer, bufferView.byteOffset, bufferView.byteLength);
 }
 class Encoder {
+    extensionCodec;
+    context;
+    maxDepth;
+    initialBufferSize;
+    sortKeys;
+    forceFloat32;
+    ignoreUndefined;
     pos;
     view;
     bytes;
@@ -2645,13 +2669,6 @@ class Encoder {
         setInt64(this.view, this.pos, value);
         this.pos += 8;
     }
-    extensionCodec;
-    context;
-    maxDepth;
-    initialBufferSize;
-    sortKeys;
-    forceFloat32;
-    ignoreUndefined;
 }
 const defaultEncodeOptions = {};
 function encode1(value, options = defaultEncodeOptions) {
@@ -2662,6 +2679,8 @@ function prettyByte(__byte) {
     return `${__byte < 0 ? "-" : ""}0x${Math.abs(__byte).toString(16).padStart(2, "0")}`;
 }
 class CachedKeyDecoder {
+    maxKeyLength;
+    maxLengthPerKey;
     hit;
     miss;
     caches;
@@ -2717,8 +2736,6 @@ class CachedKeyDecoder {
         this.store(slicedCopyOfBytes, value);
         return value;
     }
-    maxKeyLength;
-    maxLengthPerKey;
 }
 var State;
 (function(State) {
@@ -2744,6 +2761,14 @@ const DataViewIndexOutOfBoundsError = (()=>{
 const MORE_DATA = new DataViewIndexOutOfBoundsError("Insufficient data");
 const sharedCachedKeyDecoder = new CachedKeyDecoder();
 class Decoder {
+    extensionCodec;
+    context;
+    maxStrLength;
+    maxBinLength;
+    maxArrayLength;
+    maxMapLength;
+    maxExtLength;
+    keyDecoder;
     totalPos;
     pos;
     view;
@@ -3191,14 +3216,6 @@ class Decoder {
         this.pos += 8;
         return value;
     }
-    extensionCodec;
-    context;
-    maxStrLength;
-    maxBinLength;
-    maxArrayLength;
-    maxMapLength;
-    maxExtLength;
-    keyDecoder;
 }
 const defaultDecodeOptions = {};
 function decode1(buffer, options = defaultDecodeOptions) {
@@ -4449,7 +4466,7 @@ function globToRegExp(glob, { extended =true , globstar: globstarOption = true ,
                         else if (value == "lower") segment += "a-z";
                         else if (value == "print") segment += "\x20-\x7E";
                         else if (value == "punct") {
-                            segment += "!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_ÔÇÿ{|}~";
+                            segment += "!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_‘{|}~";
                         } else if (value == "space") segment += "\\s\v";
                         else if (value == "upper") segment += "A-Z";
                         else if (value == "word") segment += "\\w";
@@ -5072,6 +5089,11 @@ function urlSimplify(url) {
         return url;
     }
 }
+const battleTime = (id)=>{
+    const { timestamp  } = parseHistoryDetailId(id);
+    const dateStr = timestamp.replace(/(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6Z");
+    return new Date(dateStr);
+};
 async function loginSteps({ newFetcher  }, step2) {
     const fetch = newFetcher();
     if (!step2) {
@@ -5182,12 +5204,13 @@ async function getGToken({ fApi , sessionToken , env  }) {
         }
     });
     const uiRespJson = await uiResp.json();
-    const { nickname , birthday , language , country  } = uiRespJson;
+    const { nickname , birthday , language , country , id: userId  } = uiRespJson;
     const getIdToken2 = async (idToken)=>{
         const { f , request_id: requestId , timestamp  } = await callImink({
             fApi,
             step: 1,
             idToken,
+            userId,
             env
         });
         const resp = await fetch.post({
@@ -5214,20 +5237,26 @@ async function getGToken({ fApi , sessionToken , env  }) {
         });
         const respJson = await resp.json();
         const idToken2 = respJson?.result?.webApiServerCredential?.accessToken;
-        if (!idToken2) {
+        const coralUserId = respJson?.result?.user?.id?.toString();
+        if (!idToken2 || !coralUserId) {
             throw new APIError({
                 response: resp,
                 json: respJson,
-                message: "No idToken2 found"
+                message: `No idToken2 or coralUserId found. Please try again later. (${idToken2.length}, ${coralUserId.length})`
             });
         }
-        return idToken2;
+        return [
+            idToken2,
+            coralUserId
+        ];
     };
-    const getGToken = async (idToken)=>{
+    const getGToken = async (idToken, coralUserId)=>{
         const { f , request_id: requestId , timestamp  } = await callImink({
             step: 2,
             idToken,
             fApi,
+            userId,
+            coralUserId,
             env
         });
         const resp = await fetch.post({
@@ -5261,8 +5290,8 @@ async function getGToken({ fApi , sessionToken , env  }) {
         }
         return webServiceToken;
     };
-    const idToken2 = await retry(()=>getIdToken2(idToken));
-    const webServiceToken = await retry(()=>getGToken(idToken2));
+    const [idToken2, coralUserId] = await retry(()=>getIdToken2(idToken));
+    const webServiceToken = await retry(()=>getGToken(idToken2, coralUserId));
     return {
         webServiceToken,
         nickname,
@@ -5359,7 +5388,8 @@ async function getSessionToken({ fetch , sessionTokenCode , authCodeVerifier  })
     }
     return json["session_token"];
 }
-async function callImink({ fApi , step , idToken , env  }) {
+async function callImink(params) {
+    const { fApi , step , idToken , userId , coralUserId , env  } = params;
     const { post  } = env.newFetcher();
     const resp = await post({
         url: fApi,
@@ -5369,7 +5399,9 @@ async function callImink({ fApi , step , idToken , env  }) {
         },
         body: JSON.stringify({
             "token": idToken,
-            "hash_method": step
+            "hash_method": step,
+            "na_id": userId,
+            "coral_user_id": coralUserId
         })
     });
     return await resp.json();
@@ -5422,6 +5454,7 @@ const DEFAULT_STATE = {
     monitorInterval: 500
 };
 class FileStateBackend {
+    path;
     constructor(path){
         this.path = path;
     }
@@ -5436,7 +5469,6 @@ class FileStateBackend {
         await Deno.writeTextFile(swapPath, data);
         await Deno.rename(swapPath, this.path);
     }
-    path;
 }
 class Profile {
     _state;
@@ -5469,29 +5501,15 @@ class Profile {
         }
     }
 }
-var Queries;
-(function(Queries) {
-    Queries["HomeQuery"] = "22e2fa8294168003c21b00c333c35384";
-    Queries["LatestBattleHistoriesQuery"] = "4f5f26e64bca394b45345a65a2f383bd";
-    Queries["RegularBattleHistoriesQuery"] = "d5b795d09e67ce153e622a184b7e7dfa";
-    Queries["BankaraBattleHistoriesQuery"] = "de4754588109b77dbcb90fbe44b612ee";
-    Queries["XBattleHistoriesQuery"] = "45c74fefb45a49073207229ca65f0a62";
-    Queries["PrivateBattleHistoriesQuery"] = "1d6ed57dc8b801863126ad4f351dfb9a";
-    Queries["VsHistoryDetailQuery"] = "291295ad311b99a6288fc95a5c4cb2d2";
-    Queries["CoopHistoryQuery"] = "6ed02537e4a65bbb5e7f4f23092f6154";
-    Queries["CoopHistoryDetailQuery"] = "379f0d9b78b531be53044bcac031b34b";
-    Queries["myOutfitCommonDataFilteringConditionQuery"] = "d02ab22c9dccc440076055c8baa0fa7a";
-    Queries["myOutfitCommonDataEquipmentsQuery"] = "d29cd0c2b5e6bac90dd5b817914832f8";
-    Queries["HistoryRecordQuery"] = "32b6771f94083d8f04848109b7300af5";
-    Queries["ConfigureAnalyticsQuery"] = "f8ae00773cc412a50dd41a6d9a159ddd";
-})(Queries || (Queries = {}));
 var BattleListType;
 (function(BattleListType) {
     BattleListType[BattleListType["Latest"] = 0] = "Latest";
     BattleListType[BattleListType["Regular"] = 1] = "Regular";
     BattleListType[BattleListType["Bankara"] = 2] = "Bankara";
-    BattleListType[BattleListType["Private"] = 3] = "Private";
-    BattleListType[BattleListType["Coop"] = 4] = "Coop";
+    BattleListType[BattleListType["Event"] = 3] = "Event";
+    BattleListType[BattleListType["XBattle"] = 4] = "XBattle";
+    BattleListType[BattleListType["Private"] = 5] = "Private";
+    BattleListType[BattleListType["Coop"] = 6] = "Coop";
 })(BattleListType || (BattleListType = {}));
 var SummaryEnum;
 (function(SummaryEnum) {
@@ -5596,6 +5614,8 @@ class Splatnet3 {
         [BattleListType.Latest]: ()=>this.request(Queries.LatestBattleHistoriesQuery).then((r)=>getIdsFromGroups(r.latestBattleHistories)),
         [BattleListType.Regular]: ()=>this.request(Queries.RegularBattleHistoriesQuery).then((r)=>getIdsFromGroups(r.regularBattleHistories)),
         [BattleListType.Bankara]: ()=>this.request(Queries.BankaraBattleHistoriesQuery).then((r)=>getIdsFromGroups(r.bankaraBattleHistories)),
+        [BattleListType.XBattle]: ()=>this.request(Queries.XBattleHistoriesQuery).then((r)=>getIdsFromGroups(r.xBattleHistories)),
+        [BattleListType.Event]: ()=>this.request(Queries.EventBattleHistoriesQuery).then((r)=>getIdsFromGroups(r.eventBattleHistories)),
         [BattleListType.Private]: ()=>this.request(Queries.PrivateBattleHistoriesQuery).then((r)=>getIdsFromGroups(r.privateBattleHistories)),
         [BattleListType.Coop]: ()=>this.request(Queries.CoopHistoryQuery).then((r)=>getIdsFromGroups(r.coopResult))
     };
@@ -5614,6 +5634,24 @@ class Splatnet3 {
     async getBattleList(battleListType = BattleListType.Latest) {
         return await this.BATTLE_LIST_TYPE_MAP[battleListType]();
     }
+    async getAllBattleList() {
+        const ALL_TYPE = [
+            BattleListType.Regular,
+            BattleListType.Bankara,
+            BattleListType.XBattle,
+            BattleListType.Event,
+            BattleListType.Private
+        ];
+        const ids = [];
+        for (const type of ALL_TYPE){
+            ids.push(...await this.getBattleList(type));
+        }
+        const timeMap = new Map(ids.map((id)=>[
+                id,
+                battleTime(id)
+            ]));
+        return ids.sort((a, b)=>timeMap.get(b).getTime() - timeMap.get(a).getTime());
+    }
     getBattleDetail(id) {
         return this.request(Queries.VsHistoryDetailQuery, {
             vsResultId: id
@@ -5689,6 +5727,7 @@ class MemoryCache {
     }
 }
 class FileCache {
+    path;
     constructor(path){
         this.path = path;
     }
@@ -5720,8 +5759,8 @@ class FileCache {
         await Deno.writeFile(swapPath, data);
         await Deno.rename(swapPath, path);
     }
-    path;
 }
+const __default = JSON.parse("[\n  {\n    \"key\": \"ink_saver_main\",\n    \"name\": {\n      \"de-DE\": \"Hauptverbrauch\",\n      \"en-GB\": \"Ink Saver (Main)\",\n      \"en-US\": \"Ink Saver (Main)\",\n      \"es-ES\": \"Tintahorro (ppal.)\",\n      \"es-MX\": \"Ahorro tinta (ppal.)\",\n      \"fr-CA\": \"Encrémenteur (pr.)\",\n      \"fr-FR\": \"Encrémenteur (pr.)\",\n      \"it-IT\": \"Eco-colore princ.\",\n      \"ja-JP\": \"インク効率アップ(メイン)\",\n      \"ko-KR\": \"잉크 효율 업(메인)\",\n      \"nl-NL\": \"Hoofdspaarder\",\n      \"ru-RU\": \"Основной баллон X\",\n      \"zh-CN\": \"提升墨汁效率（主要武器）\",\n      \"zh-TW\": \"提升墨汁效率（主要武器）\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"ink_saver_sub\",\n    \"name\": {\n      \"de-DE\": \"Sekundärverbrauch\",\n      \"en-GB\": \"Ink Saver (Sub)\",\n      \"en-US\": \"Ink Saver (Sub)\",\n      \"es-ES\": \"Tintahorro (sec.)\",\n      \"es-MX\": \"Ahorro tinta (sec.)\",\n      \"fr-CA\": \"Encrémenteur (sec.)\",\n      \"fr-FR\": \"Encrémenteur (sec.)\",\n      \"it-IT\": \"Eco-colore second.\",\n      \"ja-JP\": \"インク効率アップ(サブ)\",\n      \"ko-KR\": \"잉크 효율 업(서브)\",\n      \"nl-NL\": \"Subspaarder\",\n      \"ru-RU\": \"Запасной баллон X\",\n      \"zh-CN\": \"提升墨汁效率（次要武器）\",\n      \"zh-TW\": \"提升墨汁效率（次要武器）\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"ink_recovery_up\",\n    \"name\": {\n      \"de-DE\": \"Regeneration +\",\n      \"en-GB\": \"Ink Recovery Up\",\n      \"en-US\": \"Ink Recovery Up\",\n      \"es-ES\": \"Recarga rápida\",\n      \"es-MX\": \"Mejor recarga tinta\",\n      \"fr-CA\": \"Levée d'encre\",\n      \"fr-FR\": \"Levée d'encre\",\n      \"it-IT\": \"Recupero colore +\",\n      \"ja-JP\": \"インク回復力アップ\",\n      \"ko-KR\": \"잉크 회복력 업\",\n      \"nl-NL\": \"Inktvulling\",\n      \"ru-RU\": \"Быстрый баллон\",\n      \"zh-CN\": \"提升墨汁回复力\",\n      \"zh-TW\": \"提升墨汁回復力\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"run_speed_up\",\n    \"name\": {\n      \"de-DE\": \"Lauftempo +\",\n      \"en-GB\": \"Run Speed Up\",\n      \"en-US\": \"Run Speed Up\",\n      \"es-ES\": \"Supercarrera\",\n      \"es-MX\": \"Carrera acelerada\",\n      \"fr-CA\": \"Course à pied\",\n      \"fr-FR\": \"Course à pied\",\n      \"it-IT\": \"Velocità +\",\n      \"ja-JP\": \"ヒト移動速度アップ\",\n      \"ko-KR\": \"인간 이동 속도 업\",\n      \"nl-NL\": \"Hardloper\",\n      \"ru-RU\": \"Спринтер\",\n      \"zh-CN\": \"提升人类移动速度\",\n      \"zh-TW\": \"提升人類移動速度\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"swim_speed_up\",\n    \"name\": {\n      \"de-DE\": \"Schwimmtempo +\",\n      \"en-GB\": \"Swim Speed Up\",\n      \"en-US\": \"Swim Speed Up\",\n      \"es-ES\": \"Superbuceo\",\n      \"es-MX\": \"Nado acelerado\",\n      \"fr-CA\": \"Turbo-calmar\",\n      \"fr-FR\": \"Turbo-calamar\",\n      \"it-IT\": \"Velocità nuoto +\",\n      \"ja-JP\": \"イカダッシュ速度アップ\",\n      \"ko-KR\": \"징어대시 속도 업\",\n      \"nl-NL\": \"Zwemdiploma\",\n      \"ru-RU\": \"Плавунец\",\n      \"zh-CN\": \"提升鱿鱼冲刺速度\",\n      \"zh-TW\": \"提升魷魚衝刺速度\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"special_charge_up\",\n    \"name\": {\n      \"de-DE\": \"Spezialladezeit +\",\n      \"en-GB\": \"Special Charge Up\",\n      \"en-US\": \"Special Charge Up\",\n      \"es-ES\": \"Recarga especial\",\n      \"es-MX\": \"Recarga especial\",\n      \"fr-CA\": \"Jauge spéciale +\",\n      \"fr-FR\": \"Jauge spéciale +\",\n      \"it-IT\": \"Ricarica speciale +\",\n      \"ja-JP\": \"スペシャル増加量アップ\",\n      \"ko-KR\": \"스페셜 증가량 업\",\n      \"nl-NL\": \"Speciaallader\",\n      \"ru-RU\": \"Особый насос\",\n      \"zh-CN\": \"提升特殊武器增加量\",\n      \"zh-TW\": \"提升特殊武器增加量\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"special_saver\",\n    \"name\": {\n      \"de-DE\": \"Spezialabzug -\",\n      \"en-GB\": \"Special Saver\",\n      \"en-US\": \"Special Saver\",\n      \"es-ES\": \"Reducción especial\",\n      \"es-MX\": \"Ahorro especial\",\n      \"fr-CA\": \"Baisse spéciale -\",\n      \"fr-FR\": \"Baisse spéciale -\",\n      \"it-IT\": \"Riduzione speciale -\",\n      \"ja-JP\": \"スペシャル減少量ダウン\",\n      \"ko-KR\": \"스페셜 감소량 다운\",\n      \"nl-NL\": \"Speciaalspaarder\",\n      \"ru-RU\": \"Особый резерв\",\n      \"zh-CN\": \"降低特殊武器减少量\",\n      \"zh-TW\": \"降低特殊武器減少量\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"special_power_up\",\n    \"name\": {\n      \"de-DE\": \"Spezialstärke +\",\n      \"en-GB\": \"Special Power Up\",\n      \"en-US\": \"Special Power Up\",\n      \"es-ES\": \"Superarma especial\",\n      \"es-MX\": \"Mejora especial\",\n      \"fr-CA\": \"Arme spéciale +\",\n      \"fr-FR\": \"Arme spéciale +\",\n      \"it-IT\": \"Arma speciale +\",\n      \"ja-JP\": \"スペシャル性能アップ\",\n      \"ko-KR\": \"스페셜 성능 업\",\n      \"nl-NL\": \"Specialist\",\n      \"ru-RU\": \"Особый подход\",\n      \"zh-CN\": \"提升特殊武器性能\",\n      \"zh-TW\": \"提升特殊武器性能\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"quick_respawn\",\n    \"name\": {\n      \"de-DE\": \"Schnelle Rückkehr\",\n      \"en-GB\": \"Quick Respawn\",\n      \"en-US\": \"Quick Respawn\",\n      \"es-ES\": \"Retorno exprés\",\n      \"es-MX\": \"Regeneración rápida\",\n      \"fr-CA\": \"Sans temps mort\",\n      \"fr-FR\": \"Sans temps morts\",\n      \"it-IT\": \"Il tempo è colore\",\n      \"ja-JP\": \"復活時間短縮\",\n      \"ko-KR\": \"부활 시간 단축\",\n      \"nl-NL\": \"Comeback\",\n      \"ru-RU\": \"Феникс\",\n      \"zh-CN\": \"缩短复活时间\",\n      \"zh-TW\": \"縮短復活時間\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"quick_super_jump\",\n    \"name\": {\n      \"de-DE\": \"Supersprung +\",\n      \"en-GB\": \"Quick Super Jump\",\n      \"en-US\": \"Quick Super Jump\",\n      \"es-ES\": \"Supersalto rápido\",\n      \"es-MX\": \"Supersalto rápido\",\n      \"fr-CA\": \"Aérodynamisme\",\n      \"fr-FR\": \"Aérodynamisme\",\n      \"it-IT\": \"Salti super e veloci\",\n      \"ja-JP\": \"スーパージャンプ時間短縮\",\n      \"ko-KR\": \"슈퍼 점프 시간 단축\",\n      \"nl-NL\": \"Turbosprong\",\n      \"ru-RU\": \"Суперпрыгун\",\n      \"zh-CN\": \"缩短超级跳跃时间\",\n      \"zh-TW\": \"縮短超級跳躍時間\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"sub_power_up\",\n    \"name\": {\n      \"de-DE\": \"Sekundärstärke +\",\n      \"en-GB\": \"Sub Power Up\",\n      \"en-US\": \"Sub Power Up\",\n      \"es-ES\": \"Superarma secundaria\",\n      \"es-MX\": \"Mejora secundaria\",\n      \"fr-CA\": \"Arme secondaire +\",\n      \"fr-FR\": \"Arme secondaire +\",\n      \"it-IT\": \"Arma secondaria +\",\n      \"ja-JP\": \"サブ性能アップ\",\n      \"ko-KR\": \"서브 성능 업\",\n      \"nl-NL\": \"Subtopper\",\n      \"ru-RU\": \"Про-Запас\",\n      \"zh-CN\": \"提升次要武器性能\",\n      \"zh-TW\": \"提升次要武器性能\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"ink_resistance_up\",\n    \"name\": {\n      \"de-DE\": \"Tintentoleranz +\",\n      \"en-GB\": \"Ink Resistance Up\",\n      \"en-US\": \"Ink Resistance Up\",\n      \"es-ES\": \"Impermeabilidad\",\n      \"es-MX\": \"Impermeabilidad\",\n      \"fr-CA\": \"Imperméabilité\",\n      \"fr-FR\": \"Pieds au sec\",\n      \"it-IT\": \"Scarpe impermeabili\",\n      \"ja-JP\": \"相手インク影響軽減\",\n      \"ko-KR\": \"상대 잉크 영향 감소\",\n      \"nl-NL\": \"Inkttolerantie\",\n      \"ru-RU\": \"Краскостойкость\",\n      \"zh-CN\": \"减轻对手墨汁影响\",\n      \"zh-TW\": \"減輕對手墨汁影響\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"sub_resistance_up\",\n    \"name\": {\n      \"de-DE\": \"Sekundärschutz +\",\n      \"en-GB\": \"Sub Resistance Up\",\n      \"en-US\": \"Sub Resistance Up\",\n      \"es-ES\": \"Resistencia secundaria\",\n      \"es-MX\": \"Resistencia secundaria\",\n      \"fr-CA\": \"Filtre à secondaires\",\n      \"fr-FR\": \"Filtre à secondaires\",\n      \"it-IT\": \"Arma sec. impermeabile\",\n      \"ja-JP\": \"サブ影響軽減\",\n      \"ko-KR\": \"서브 영향 감소\",\n      \"nl-NL\": \"Subdemper\",\n      \"ru-RU\": \"Стойкость запаса\",\n      \"zh-CN\": \"减轻次要武器影响\",\n      \"zh-TW\": \"減輕次要武器影響\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"intensify_action\",\n    \"name\": {\n      \"de-DE\": \"Action +\",\n      \"en-GB\": \"Intensify Action\",\n      \"en-US\": \"Intensify Action\",\n      \"es-ES\": \"Agilidad extra\",\n      \"es-MX\": \"Agilidad extra\",\n      \"fr-CA\": \"Feu de l'action\",\n      \"fr-FR\": \"Feu de l'action\",\n      \"it-IT\": \"Intensificazione\",\n      \"ja-JP\": \"アクション強化\",\n      \"ko-KR\": \"액션 강화\",\n      \"nl-NL\": \"Actie-assistentie\",\n      \"ru-RU\": \"Ультраудар\",\n      \"zh-CN\": \"行动强化\",\n      \"zh-TW\": \"行動強化\"\n    },\n    \"primary_only\": false\n  },\n  {\n    \"key\": \"opening_gambit\",\n    \"name\": {\n      \"de-DE\": \"Startvorteil\",\n      \"en-GB\": \"Opening Gambit\",\n      \"en-US\": \"Opening Gambit\",\n      \"es-ES\": \"Acelerón de salida\",\n      \"es-MX\": \"Acelerón de salida\",\n      \"fr-CA\": \"Départ toute allure\",\n      \"fr-FR\": \"Chapeaux de roue\",\n      \"it-IT\": \"Partenza a razzo\",\n      \"ja-JP\": \"スタートダッシュ\",\n      \"ko-KR\": \"스타트 대시\",\n      \"nl-NL\": \"Vliegende start\",\n      \"ru-RU\": \"Стартовый спурт\",\n      \"zh-CN\": \"最初冲刺\",\n      \"zh-TW\": \"最初衝刺\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"last_ditch_effort\",\n    \"name\": {\n      \"de-DE\": \"Endspurt\",\n      \"en-GB\": \"Last-Ditch Effort\",\n      \"en-US\": \"Last-Ditch Effort\",\n      \"es-ES\": \"Sprint final\",\n      \"es-MX\": \"Último recurso\",\n      \"fr-CA\": \"Ultime sursaut\",\n      \"fr-FR\": \"Ultime sursaut\",\n      \"it-IT\": \"Splash finale\",\n      \"ja-JP\": \"ラストスパート\",\n      \"ko-KR\": \"라스트 스퍼트\",\n      \"nl-NL\": \"Eindsprint\",\n      \"ru-RU\": \"Финишный спурт\",\n      \"zh-CN\": \"最后冲刺\",\n      \"zh-TW\": \"最後衝刺\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"tenacity\",\n    \"name\": {\n      \"de-DE\": \"Zähigkeit\",\n      \"en-GB\": \"Tenacity\",\n      \"en-US\": \"Tenacity\",\n      \"es-ES\": \"Ventaja\",\n      \"es-MX\": \"Tenacidad\",\n      \"fr-CA\": \"Ténacité\",\n      \"fr-FR\": \"Justice\",\n      \"it-IT\": \"Tenacia\",\n      \"ja-JP\": \"逆境強化\",\n      \"ko-KR\": \"역경 강화\",\n      \"nl-NL\": \"Volharding\",\n      \"ru-RU\": \"Компенсатор\",\n      \"zh-CN\": \"逆境强化\",\n      \"zh-TW\": \"逆境強化\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"comeback\",\n    \"name\": {\n      \"de-DE\": \"Rückkehr\",\n      \"en-GB\": \"Comeback\",\n      \"en-US\": \"Comeback\",\n      \"es-ES\": \"Remontada\",\n      \"es-MX\": \"Remonte\",\n      \"fr-CA\": \"Retour\",\n      \"fr-FR\": \"Come-back\",\n      \"it-IT\": \"Gran ritorno\",\n      \"ja-JP\": \"カムバック\",\n      \"ko-KR\": \"컴백\",\n      \"nl-NL\": \"Opfrisser\",\n      \"ru-RU\": \"Ответный удар\",\n      \"zh-CN\": \"回归\",\n      \"zh-TW\": \"回歸\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"ninja_squid\",\n    \"name\": {\n      \"de-DE\": \"Tintenfisch-Ninja\",\n      \"en-GB\": \"Ninja Squid\",\n      \"en-US\": \"Ninja Squid\",\n      \"es-ES\": \"Ninjalamar\",\n      \"es-MX\": \"Ninjalamar\",\n      \"fr-CA\": \"Ninjalmar\",\n      \"fr-FR\": \"Ninjalamar\",\n      \"it-IT\": \"Calamaro ninja\",\n      \"ja-JP\": \"イカニンジャ\",\n      \"ko-KR\": \"징어닌자\",\n      \"nl-NL\": \"Ninja-inktvis\",\n      \"ru-RU\": \"Мимикрия\",\n      \"zh-CN\": \"鱿鱼忍者\",\n      \"zh-TW\": \"魷魚忍者\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"haunt\",\n    \"name\": {\n      \"de-DE\": \"Vergeltung\",\n      \"en-GB\": \"Haunt\",\n      \"en-US\": \"Haunt\",\n      \"es-ES\": \"Represalia\",\n      \"es-MX\": \"Resentimiento\",\n      \"fr-CA\": \"Vengeance\",\n      \"fr-FR\": \"Revanche\",\n      \"it-IT\": \"Rappresaglia\",\n      \"ja-JP\": \"リベンジ\",\n      \"ko-KR\": \"리벤지\",\n      \"nl-NL\": \"Revanche\",\n      \"ru-RU\": \"Вендетта\",\n      \"zh-CN\": \"复仇\",\n      \"zh-TW\": \"復仇\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"thermal_ink\",\n    \"name\": {\n      \"de-DE\": \"Markierfarbe\",\n      \"en-GB\": \"Thermal Ink\",\n      \"en-US\": \"Thermal Ink\",\n      \"es-ES\": \"Señuelo\",\n      \"es-MX\": \"Tinta rastreadora\",\n      \"fr-CA\": \"Encre thermique\",\n      \"fr-FR\": \"Encre thermique\",\n      \"it-IT\": \"Inchiostro termico\",\n      \"ja-JP\": \"サーマルインク\",\n      \"ko-KR\": \"서멀 잉크\",\n      \"nl-NL\": \"Markeerstift\",\n      \"ru-RU\": \"Клеймо\",\n      \"zh-CN\": \"热力墨汁\",\n      \"zh-TW\": \"熱力墨汁\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"respawn_punisher\",\n    \"name\": {\n      \"de-DE\": \"Heimsuchung\",\n      \"en-GB\": \"Respawn Punisher\",\n      \"en-US\": \"Respawn Punisher\",\n      \"es-ES\": \"Castigo póstumo\",\n      \"es-MX\": \"Castigo póstumo\",\n      \"fr-CA\": \"Retour perdant\",\n      \"fr-FR\": \"Retour perdant\",\n      \"it-IT\": \"Castigo\",\n      \"ja-JP\": \"復活ペナルティアップ\",\n      \"ko-KR\": \"부활 페널티 업\",\n      \"nl-NL\": \"Repercussie\",\n      \"ru-RU\": \"Кара\",\n      \"zh-CN\": \"提升复活惩罚\",\n      \"zh-TW\": \"提升復活懲罰\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"ability_doubler\",\n    \"name\": {\n      \"de-DE\": \"Effektdoppelung\",\n      \"en-GB\": \"Ability Doubler\",\n      \"en-US\": \"Ability Doubler\",\n      \"es-ES\": \"Duplicador\",\n      \"es-MX\": \"Duplicador\",\n      \"fr-CA\": \"Bonus ×2\",\n      \"fr-FR\": \"Bonus ×2\",\n      \"it-IT\": \"Raddoppiatore\",\n      \"ja-JP\": \"追加ギアパワー倍化\",\n      \"ko-KR\": \"추가 기어 파워 2배\",\n      \"nl-NL\": \"Verdubbelaar\",\n      \"ru-RU\": \"Дупликатор\",\n      \"zh-CN\": \"追加装备能力增倍\",\n      \"zh-TW\": \"追加裝備能力增倍\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"stealth_jump\",\n    \"name\": {\n      \"de-DE\": \"Sprunginfiltration\",\n      \"en-GB\": \"Stealth Jump\",\n      \"en-US\": \"Stealth Jump\",\n      \"es-ES\": \"Supersalto invisible\",\n      \"es-MX\": \"Supersalto invisible\",\n      \"fr-CA\": \"Super saut invisible\",\n      \"fr-FR\": \"Réception réussie\",\n      \"it-IT\": \"Salto al buio\",\n      \"ja-JP\": \"ステルスジャンプ\",\n      \"ko-KR\": \"스텔스 점프\",\n      \"nl-NL\": \"Sluipsprong\",\n      \"ru-RU\": \"Десант\",\n      \"zh-CN\": \"隐身跳跃\",\n      \"zh-TW\": \"隱身跳躍\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"object_shredder\",\n    \"name\": {\n      \"de-DE\": \"Zerstörer\",\n      \"en-GB\": \"Object Shredder\",\n      \"en-US\": \"Object Shredder\",\n      \"es-ES\": \"Demolición\",\n      \"es-MX\": \"Demolición\",\n      \"fr-CA\": \"Démolition\",\n      \"fr-FR\": \"Démolition\",\n      \"it-IT\": \"Demolitore\",\n      \"ja-JP\": \"対物攻撃力アップ\",\n      \"ko-KR\": \"오브젝트 공격력 업\",\n      \"nl-NL\": \"Sloper\",\n      \"ru-RU\": \"Демонтажник\",\n      \"zh-CN\": \"提升对物体攻击力\",\n      \"zh-TW\": \"提升對物體攻擊力\"\n    },\n    \"primary_only\": true\n  },\n  {\n    \"key\": \"drop_roller\",\n    \"name\": {\n      \"de-DE\": \"Tricklandung\",\n      \"en-GB\": \"Drop Roller\",\n      \"en-US\": \"Drop Roller\",\n      \"es-ES\": \"Amortiguador\",\n      \"es-MX\": \"Aterrizaje rodante\",\n      \"fr-CA\": \"Super roulade\",\n      \"fr-FR\": \"Super roulade\",\n      \"it-IT\": \"Atterraggio stiloso\",\n      \"ja-JP\": \"受け身術\",\n      \"ko-KR\": \"낙법\",\n      \"nl-NL\": \"Rolmodel\",\n      \"ru-RU\": \"Акробат\",\n      \"zh-CN\": \"受身术\",\n      \"zh-TW\": \"受身術\"\n    },\n    \"primary_only\": true\n  }\n]");
 const COOP_POINT_MAP = {
     0: -20,
     1: -10,
@@ -5739,6 +5778,8 @@ async function checkResponse(resp) {
     }
 }
 class StatInkAPI {
+    statInkApiKey;
+    env;
     statInk;
     FETCH_LOCK;
     cache;
@@ -5751,7 +5792,7 @@ class StatInkAPI {
         this._salmonWeaponMap = new Map();
         this.getSalmonWeapon = ()=>this._getCached(`${this.statInk}/api/v3/salmon/weapon?full=1`);
         this.getWeapon = ()=>this._getCached(`${this.statInk}/api/v3/weapon?full=1`);
-        this.getAbility = ()=>this._getCached(`${this.statInk}/api/v3/ability?full=1`);
+        this.getAbility = ()=>__default;
         this.getStage = ()=>this._getCached(`${this.statInk}/api/v3/stage`);
         if (statInkApiKey.length !== 43) {
             throw new Error("Invalid stat.ink API key");
@@ -5854,8 +5895,8 @@ class StatInkAPI {
         }
     }
     _getAliasName(name) {
-        const STAT_INK_DOT = "┬À";
-        const SPLATNET_DOT = "ÔÇº";
+        const STAT_INK_DOT = "·";
+        const SPLATNET_DOT = "‧";
         if (name.includes(STAT_INK_DOT)) {
             return [
                 name,
@@ -5890,8 +5931,6 @@ class StatInkAPI {
     getWeapon;
     getAbility;
     getStage;
-    statInkApiKey;
-    env;
 }
 class StatInkExporter {
     name = "stat.ink";
@@ -5964,6 +6003,8 @@ class StatInkExporter {
             }
         } else if (vsMode === "X_MATCH") {
             return "xmatch";
+        } else if (vsMode === "LEAGUE") {
+            return "event";
         }
         throw new TypeError(`Unknown vsMode ${vsMode}`);
     }
@@ -6028,7 +6069,7 @@ class StatInkExporter {
         return result;
     };
     async mapBattle({ groupInfo , challengeProgress , bankaraMatchChallenge , listNode , detail: vsDetail , rankBeforeState , rankState  }) {
-        const { knockout , vsRule: { rule  } , myTeam , otherTeams , bankaraMatch , festMatch , playedTime  } = vsDetail;
+        const { knockout , vsRule: { rule  } , myTeam , otherTeams , bankaraMatch , leagueMatch , festMatch , playedTime  } = vsDetail;
         const self = vsDetail.myTeam.players.find((i)=>i.isMyself);
         if (!self) {
             throw new Error("Self not found");
@@ -6124,6 +6165,10 @@ class StatInkExporter {
                 result.rank_after_s_plus = result.rank_before_s_plus;
             }
         }
+        if (leagueMatch) {
+            result.event = leagueMatch.leagueMatchEvent?.id;
+            result.event_power = leagueMatch.myLeaguePower;
+        }
         if (challengeProgress) {
             result.challenge_win = challengeProgress.winCount;
             result.challenge_lose = challengeProgress.loseCount;
@@ -6134,6 +6179,7 @@ class StatInkExporter {
                 result.x_power_after = groupInfo.xMatchMeasurement.xPowerAfter;
             }
         }
+        result.bankara_power_after = vsDetail.bankaraMatch?.bankaraPower?.power;
         if (rankBeforeState && rankState) {
             result.rank_before_exp = rankBeforeState.rankPoint;
             result.rank_after_exp = rankState.rankPoint;
@@ -6237,7 +6283,8 @@ class StatInkExporter {
             golden_quota: wave.deliverNorm,
             golden_appearances: wave.goldenPopCount,
             golden_delivered: wave.teamDeliverCount,
-            special_uses
+            special_uses,
+            danger_rate: null
         };
     }
     async mapCoop({ gradeBefore , groupInfo , detail  }) {
@@ -6255,9 +6302,10 @@ class StatInkExporter {
             ]));
         const title_after = detail.afterGrade ? b64Number(detail.afterGrade.id).toString() : undefined;
         const title_exp_after = detail.afterGradePoint;
+        const maxWaves = detail.rule === "TEAM_CONTEST" ? 5 : 3;
         let clear_waves;
         if (waveResults.length > 0) {
-            clear_waves = waveResults.filter((i)=>i.waveNumber < 4).length - 1 + (resultWave === 0 ? 1 : 0);
+            clear_waves = waveResults.filter((i)=>i.waveNumber < maxWaves + 1).length - 1 + (resultWave === 0 ? 1 : 0);
         } else {
             clear_waves = 0;
         }
@@ -6282,7 +6330,7 @@ class StatInkExporter {
             }
         }
         let fail_reason = null;
-        if (clear_waves !== 3 && waveResults.length > 0) {
+        if (clear_waves !== maxWaves && waveResults.length > 0) {
             const lastWave = waveResults[waveResults.length - 1];
             if (lastWave.teamDeliverCount >= lastWave.deliverNorm) {
                 fail_reason = "wipe_out";
@@ -6292,8 +6340,9 @@ class StatInkExporter {
             uuid: await gameId(detail.id),
             private: groupInfo?.mode === "PRIVATE_CUSTOM" ? "yes" : "no",
             big_run: detail.rule === "BIG_RUN" ? "yes" : "no",
+            eggstra_work: detail.rule === "TEAM_CONTEST" ? "yes" : "no",
             stage: b64Number(detail.coopStage.id).toString(),
-            danger_rate: dangerRate * 100,
+            danger_rate: detail.rule === "TEAM_CONTEST" ? null : dangerRate * 100,
             clear_waves,
             fail_reason,
             king_smell: smellMeter,
@@ -6326,6 +6375,53 @@ class StatInkExporter {
             automated: "yes",
             start_at: startedAt
         };
+        if (detail.rule === "TEAM_CONTEST") {
+            let lastWave;
+            for (const [wave] of result.waves.map((p, i)=>[
+                    p,
+                    i
+                ])){
+                let haz_level;
+                if (!lastWave) {
+                    haz_level = 60;
+                } else {
+                    const num_players = result.players.length;
+                    const quota = lastWave.golden_quota;
+                    const delivered = lastWave.golden_delivered;
+                    let added_percent = 0;
+                    if (num_players == 4) {
+                        if (delivered >= quota * 2) {
+                            added_percent = 60;
+                        } else if (delivered >= quota * 1.5) {
+                            added_percent = 30;
+                        }
+                    } else if (num_players == 3) {
+                        if (delivered >= quota * 2) {
+                            added_percent = 40;
+                        } else if (delivered >= quota * 1.5) {
+                            added_percent = 20;
+                        }
+                    } else if (num_players == 2) {
+                        if (delivered >= quota * 2) {
+                            added_percent = 20;
+                        } else if (delivered >= quota * 1.5) {
+                            added_percent = 10;
+                            added_percent = 5;
+                        }
+                    } else if (num_players == 1) {
+                        if (delivered >= quota * 2) {
+                            added_percent = 10;
+                        } else if (delivered >= quota * 1.5) {
+                            added_percent = 5;
+                        }
+                    }
+                    const prev_percent = lastWave.danger_rate;
+                    haz_level = prev_percent + added_percent;
+                }
+                wave.danger_rate = haz_level;
+                lastWave = wave;
+            }
+        }
         return result;
     }
 }
@@ -6347,6 +6443,7 @@ function replacer(key, value) {
     return typeof value === "string" ? urlSimplify(value) : undefined;
 }
 class FileExporter {
+    exportPath;
     name;
     constructor(exportPath){
         this.exportPath = exportPath;
@@ -6455,7 +6552,6 @@ class FileExporter {
         }
         return out;
     }
-    exportPath;
 }
 const SEASONS = [
     {
@@ -6475,6 +6571,12 @@ const SEASONS = [
         name: "Fresh Season 2023",
         start: new Date("2023-03-01T00:00:00+00:00"),
         end: new Date("2023-06-01T00:00:00+00:00")
+    },
+    {
+        id: "season202306",
+        name: "Sizzle Season 2023",
+        start: new Date("2023-06-01T00:00:00+00:00"),
+        end: new Date("2023-09-01T00:00:00+00:00")
     }
 ];
 const getSeason = (date)=>{
@@ -6665,11 +6767,6 @@ function addRank(state, delta) {
         }
     };
 }
-const battleTime = (id)=>{
-    const { timestamp  } = parseHistoryDetailId(id);
-    const dateStr = timestamp.replace(/(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6Z");
-    return new Date(dateStr);
-};
 function beginPoint(state, flatten) {
     if (state) {
         const index = flatten.findIndex((i)=>i.gameId === state.gameId);
@@ -6767,6 +6864,7 @@ function getRankStateByDelta(i) {
     };
 }
 class RankTracker {
+    state;
     deltaMap;
     stateMap;
     constructor(state){
@@ -6782,6 +6880,9 @@ class RankTracker {
         this.state = state;
     }
     async updateState(history) {
+        if (history.length === 0) {
+            return;
+        }
         const flatten = await Promise.all(history.flatMap(({ historyDetails , bankaraMatchChallenge  })=>{
             return historyDetails.nodes.map((j, index)=>({
                     id: j.id,
@@ -6811,7 +6912,6 @@ class RankTracker {
         }
         return curState;
     }
-    state;
 }
 class GameFetcher {
     _splatnet;
@@ -7018,6 +7118,7 @@ const DEFAULT_OPTS = {
     noProgress: false,
     monitor: false,
     withSummary: false,
+    listMethod: "auto",
     env: DEFAULT_ENV
 };
 class StepProgress {
@@ -7033,6 +7134,89 @@ class StepProgress {
         this.skipped = {};
     }
 }
+class BattleListFetcher {
+    splatnet;
+    listMethod;
+    allBattleList;
+    latestBattleList;
+    allLock;
+    latestLock;
+    constructor(listMethod, splatnet){
+        this.splatnet = splatnet;
+        this.allLock = new Mutex();
+        this.latestLock = new Mutex();
+        if (listMethod === "all") {
+            this.listMethod = "all";
+        } else if (listMethod === "latest") {
+            this.listMethod = "latest";
+        } else {
+            this.listMethod = "auto";
+        }
+    }
+    getAllBattleList() {
+        return this.allLock.use(async ()=>{
+            if (!this.allBattleList) {
+                this.allBattleList = await this.splatnet.getAllBattleList();
+            }
+            return this.allBattleList;
+        });
+    }
+    getLatestBattleList() {
+        return this.latestLock.use(async ()=>{
+            if (!this.latestBattleList) {
+                this.latestBattleList = await this.splatnet.getBattleList();
+            }
+            return this.latestBattleList;
+        });
+    }
+    async innerFetch(exporter) {
+        if (this.listMethod === "latest") {
+            return await exporter.notExported({
+                type: "VsInfo",
+                list: await this.getLatestBattleList()
+            });
+        }
+        if (this.listMethod === "all") {
+            return await exporter.notExported({
+                type: "VsInfo",
+                list: await this.getAllBattleList()
+            });
+        }
+        if (this.listMethod === "auto") {
+            const latestList = await exporter.notExported({
+                type: "VsInfo",
+                list: await this.getLatestBattleList()
+            });
+            if (latestList.length === 50) {
+                return await exporter.notExported({
+                    type: "VsInfo",
+                    list: await this.getAllBattleList()
+                });
+            }
+            return latestList;
+        }
+        throw new TypeError(`Unknown listMethod: ${this.listMethod}`);
+    }
+    async fetch(exporter) {
+        return [
+            ...await this.innerFetch(exporter)
+        ].reverse();
+    }
+}
+class CoopListFetcher {
+    splatnet;
+    constructor(splatnet){
+        this.splatnet = splatnet;
+    }
+    async fetch(exporter) {
+        return [
+            ...await exporter.notExported({
+                type: "CoopInfo",
+                list: await this.splatnet.getBattleList(BattleListType.Coop)
+            })
+        ].reverse();
+    }
+}
 function progress({ total , currentUrl , done  }) {
     return {
         total,
@@ -7041,6 +7225,7 @@ function progress({ total , currentUrl , done  }) {
     };
 }
 class App {
+    opts;
     profile;
     env;
     constructor(opts){
@@ -7051,6 +7236,13 @@ class App {
             env: opts.env
         });
         this.env = opts.env;
+        if (opts.listMethod && ![
+            "all",
+            "auto",
+            "latest"
+        ].includes(opts.listMethod)) {
+            throw new TypeError(`Unknown listMethod: ${opts.listMethod}`);
+        }
     }
     getSkipMode() {
         const mode = this.opts.skipMode;
@@ -7134,8 +7326,7 @@ class App {
         if (skipMode.includes("vs") || exporters.length === 0) {
             this.env.logger.log("Skip exporting VS games.");
         } else {
-            this.env.logger.log("Fetching battle list...");
-            const gameList = await splatnet.getBattleList();
+            const gameListFetcher = new BattleListFetcher(this.opts.listMethod ?? "auto", splatnet);
             const { redraw , endBar  } = this.exporterProgress("Export vs games");
             const fetcher = new GameFetcher({
                 cache: this.opts.cache ?? new FileCache(this.profile.state.cacheDir),
@@ -7147,7 +7338,7 @@ class App {
                     type: "VsInfo",
                     fetcher,
                     exporter: e,
-                    gameList,
+                    gameListFetcher,
                     stepProgress: stats[e.name],
                     onStep: ()=>{
                         redraw(e.name, progress(stats[e.name]));
@@ -7171,8 +7362,7 @@ class App {
         if (skipMode.includes("coop") || exporters.length === 0) {
             this.env.logger.log("Skip exporting coop games.");
         } else {
-            this.env.logger.log("Fetching coop battle list...");
-            const coopBattleList = await splatnet.getBattleList(BattleListType.Coop);
+            const gameListFetcher = new CoopListFetcher(splatnet);
             const { redraw , endBar  } = this.exporterProgress("Export coop games");
             const fetcher = new GameFetcher({
                 cache: this.opts.cache ?? new FileCache(this.profile.state.cacheDir),
@@ -7183,7 +7373,7 @@ class App {
                     type: "CoopInfo",
                     fetcher,
                     exporter: e,
-                    gameList: coopBattleList,
+                    gameListFetcher,
                     stepProgress: stats[e.name],
                     onStep: ()=>{
                         redraw(e.name, progress(stats[e.name]));
@@ -7259,14 +7449,9 @@ class App {
             await this.exportOnce();
         }
     }
-    async exportGameList({ type , fetcher , exporter , gameList , stepProgress , onStep  }) {
+    async exportGameList({ type , fetcher , exporter , gameListFetcher , stepProgress , onStep  }) {
         onStep?.();
-        const workQueue = [
-            ...await exporter.notExported({
-                type,
-                list: gameList
-            })
-        ].reverse();
+        const workQueue = await gameListFetcher.fetch(exporter);
         const step = async (id)=>{
             const detail = await fetcher.fetch(type, id);
             const result = await exporter.exportGame(detail);
@@ -7299,14 +7484,14 @@ class App {
             this.env.logger.log(`Skipped ${Object.entries(stats).map(([name, { skipped  }])=>Object.entries(skipped).map(([reason, count])=>`${name}: ${reason} (${count})`).join(", "))}`);
         }
     }
-    opts;
 }
 const parseArgs = (args)=>{
     const parsed = mod1.parse(args, {
         string: [
             "profilePath",
             "exporter",
-            "skipMode"
+            "skipMode",
+            "listMethod"
         ],
         boolean: [
             "help",
@@ -7334,7 +7519,8 @@ const parseArgs = (args)=>{
                 "s",
                 "skip-mode"
             ],
-            "withSummary": "with-summary"
+            "withSummary": "with-summary",
+            "listMethod": "list-method"
         }
     });
     return parsed;
@@ -7348,6 +7534,10 @@ Options:
     --exporter <exporter>, -e    Exporter list to use (default: stat.ink)
                                  Multiple exporters can be separated by commas
                                  (e.g. "stat.ink,file")
+    --list-method                When set to "latest", the latest 50 matches will be obtained.
+                                 When set to "all", matches of all modes will be obtained with a maximum of 250 matches (5 modes x 50 matches).
+                                 When set to "auto", the latest 50 matches will be obtained. If 50 matches have not been uploaded yet, matches will be obtained from the list of all modes.
+                                 "auto" is the default setting.
     --no-progress, -n            Disable progress bar
     --monitor, -m                Monitor mode
     --skip-mode <mode>, -s       Skip mode (default: null)

From eedfb0490fa80383938c5bbb7989aa71e5918844 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 24 Jul 2023 21:59:32 -0400
Subject: [PATCH 141/196] chore: update faker functions (2)

---
 .../app/web/statics/embed/app.placeholder.js  | 18 +++++++-------
 tests/mocks/api/axios/get/lastfm.mjs          | 24 +++++++++----------
 tests/mocks/api/axios/get/pagespeed.mjs       | 12 +++++-----
 tests/mocks/api/axios/get/spotify.mjs         | 18 +++++++-------
 tests/mocks/api/axios/post/leetcode.mjs       |  6 ++---
 5 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/source/app/web/statics/embed/app.placeholder.js b/source/app/web/statics/embed/app.placeholder.js
index 4018f332434..130c093ac91 100644
--- a/source/app/web/statics/embed/app.placeholder.js
+++ b/source/app/web/statics/embed/app.placeholder.js
@@ -91,7 +91,7 @@
           forks: faker.number.int(1000),
           releases: faker.number.int(1000),
         },
-        diskUsage: `${faker.datatype.float({min: 1, max: 999}).toFixed(1)}MB`,
+        diskUsage: `${faker.number.float({min: 1, max: 999}).toFixed(1)}MB`,
         registration: `${faker.number.int({min: 2, max: 10})} years ago`,
         cakeday: false,
         calendar: new Array(14).fill(null).map(_ => ({color: faker.helpers.arrayElement(["#ebedf0", "#9be9a8", "#40c463", "#30a14e", "#216e39"])})),
@@ -274,7 +274,7 @@
                   ? {
                     user: {
                       commits: faker.number.int(100),
-                      percentage: faker.datatype.float({max: 1}),
+                      percentage: faker.number.float({max: 1}),
                       maintainer: false,
                       stars: faker.number.int(100),
                     },
@@ -679,10 +679,10 @@
               url: options["pagespeed.url"] || "(attached website url)",
               detailed: options["pagespeed.detailed"] || false,
               scores: [
-                {score: faker.datatype.float({max: 1}), title: "Performance"},
-                {score: faker.datatype.float({max: 1}), title: "Accessibility"},
-                {score: faker.datatype.float({max: 1}), title: "Best Practices"},
-                {score: faker.datatype.float({max: 1}), title: "SEO"},
+                {score: faker.number.float({max: 1}), title: "Performance"},
+                {score: faker.number.float({max: 1}), title: "Accessibility"},
+                {score: faker.number.float({max: 1}), title: "Best Practices"},
+                {score: faker.number.float({max: 1}), title: "SEO"},
                 ...options["pagespeed.pwa"] ? [{score: faker.number.int({max: 1}), title: "PWA"}] : [],
               ],
               metrics: {
@@ -695,12 +695,12 @@
                 maxPotentialFID: faker.number.int(500),
                 observedLoad: faker.number.int(500),
                 firstMeaningfulPaint: faker.number.int(500),
-                observedCumulativeLayoutShift: faker.datatype.float({max: 1}),
+                observedCumulativeLayoutShift: faker.number.float({max: 1}),
                 observedSpeedIndex: faker.number.int(1000),
                 observedSpeedIndexTs: faker.date.recent(),
                 observedTimeOriginTs: faker.date.recent(),
                 observedLargestContentfulPaint: faker.number.int(1000),
-                cumulativeLayoutShift: faker.datatype.float({max: 1}),
+                cumulativeLayoutShift: faker.number.float({max: 1}),
                 observedFirstPaintTs: faker.date.recent(),
                 observedTraceEndTs: faker.date.recent(),
                 largestContentfulPaint: faker.number.int(2000),
@@ -1326,7 +1326,7 @@
             isocalendar: {
               streak: {max: 30 + faker.number.int(20), current: faker.number.int(30)},
               max: 10 + faker.number.int(40),
-              average: faker.datatype.float(10),
+              average: faker.number.float(10),
               svg: await staticPlaceholder(set.plugins.enabled.isocalendar, `isocalendar.${options["isocalendar.duration"]}.svg`),
               duration: options["isocalendar.duration"],
             },
diff --git a/tests/mocks/api/axios/get/lastfm.mjs b/tests/mocks/api/axios/get/lastfm.mjs
index 36360b50a11..ad301c6d5b1 100644
--- a/tests/mocks/api/axios/get/lastfm.mjs
+++ b/tests/mocks/api/axios/get/lastfm.mjs
@@ -33,19 +33,19 @@ export default function({faker, url, options, login = faker.internet.userName()}
                 image: [
                   {
                     size: "small",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                   {
                     size: "medium",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                   {
                     size: "large",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                   {
                     size: "extralarge",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                 ],
                 streamable: "0",
@@ -86,19 +86,19 @@ export default function({faker, url, options, login = faker.internet.userName()}
                 image: [
                   {
                     size: "small",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                   {
                     size: "medium",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                   {
                     size: "large",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                   {
                     size: "extralarge",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                 ],
                 url: faker.internet.url(),
@@ -130,19 +130,19 @@ export default function({faker, url, options, login = faker.internet.userName()}
                 image: [
                   {
                     size: "small",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                   {
                     size: "medium",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                   {
                     size: "large",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                   {
                     size: "extralarge",
-                    "#text": faker.image.abstract(),
+                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
                   },
                 ],
                 streamable: "0",
diff --git a/tests/mocks/api/axios/get/pagespeed.mjs b/tests/mocks/api/axios/get/pagespeed.mjs
index c958954e32d..0af64c04664 100644
--- a/tests/mocks/api/axios/get/pagespeed.mjs
+++ b/tests/mocks/api/axios/get/pagespeed.mjs
@@ -43,12 +43,12 @@ export default function({faker, url, options, login = faker.internet.userName()}
                       maxPotentialFID: faker.number.int(500),
                       observedLoad: faker.number.int(500),
                       firstMeaningfulPaint: faker.number.int(500),
-                      observedCumulativeLayoutShift: faker.datatype.float({max: 1}),
+                      observedCumulativeLayoutShift: faker.number.float({max: 1}),
                       observedSpeedIndex: faker.number.int(1000),
                       observedSpeedIndexTs: faker.date.recent(),
                       observedTimeOriginTs: faker.date.recent(),
                       observedLargestContentfulPaint: faker.number.int(1000),
-                      cumulativeLayoutShift: faker.datatype.float({max: 1}),
+                      cumulativeLayoutShift: faker.number.float({max: 1}),
                       observedFirstPaintTs: faker.date.recent(),
                       observedTraceEndTs: faker.date.recent(),
                       largestContentfulPaint: faker.number.int(2000),
@@ -78,22 +78,22 @@ export default function({faker, url, options, login = faker.internet.userName()}
               "best-practices": {
                 id: "best-practices",
                 title: "Best Practices",
-                score: faker.datatype.float({max: 1}),
+                score: faker.number.float({max: 1}),
               },
               seo: {
                 id: "seo",
                 title: "SEO",
-                score: faker.datatype.float({max: 1}),
+                score: faker.number.float({max: 1}),
               },
               accessibility: {
                 id: "accessibility",
                 title: "Accessibility",
-                score: faker.datatype.float({max: 1}),
+                score: faker.number.float({max: 1}),
               },
               performance: {
                 id: "performance",
                 title: "Performance",
-                score: faker.datatype.float({max: 1}),
+                score: faker.number.float({max: 1}),
               },
               pwa: {
                 id: "pwa",
diff --git a/tests/mocks/api/axios/get/spotify.mjs b/tests/mocks/api/axios/get/spotify.mjs
index 1519754ba8b..640726f1508 100644
--- a/tests/mocks/api/axios/get/spotify.mjs
+++ b/tests/mocks/api/axios/get/spotify.mjs
@@ -24,17 +24,17 @@ export default function({faker, url, options, login = faker.internet.userName()}
                   images: [
                     {
                       height: 640,
-                      url: faker.image.abstract(),
+                      url: faker.image.urlLoremFlickr({ category: 'abstract' }),
                       width: 640,
                     },
                     {
                       height: 300,
-                      url: faker.image.abstract(),
+                      url: faker.image.urlLoremFlickr({ category: 'abstract' }),
                       width: 300,
                     },
                     {
                       height: 64,
-                      url: faker.image.abstract(),
+                      url: faker.image.urlLoremFlickr({ category: 'abstract' }),
                       width: 64,
                     },
                   ],
@@ -81,17 +81,17 @@ export default function({faker, url, options, login = faker.internet.userName()}
                 images: [
                   {
                     height: 640,
-                    url: faker.image.abstract(),
+                    url: faker.image.urlLoremFlickr({ category: 'abstract' }),
                     width: 640,
                   },
                   {
                     height: 300,
-                    url: faker.image.abstract(),
+                    url: faker.image.urlLoremFlickr({ category: 'abstract' }),
                     width: 300,
                   },
                   {
                     height: 64,
-                    url: faker.image.abstract(),
+                    url: faker.image.urlLoremFlickr({ category: 'abstract' }),
                     width: 64,
                   },
                 ],
@@ -126,17 +126,17 @@ export default function({faker, url, options, login = faker.internet.userName()}
               images: [
                 {
                   height: 640,
-                  url: faker.image.abstract(),
+                  url: faker.image.urlLoremFlickr({ category: 'abstract' }),
                   width: 640,
                 },
                 {
                   height: 300,
-                  url: faker.image.abstract(),
+                  url: faker.image.urlLoremFlickr({ category: 'abstract' }),
                   width: 300,
                 },
                 {
                   height: 64,
-                  url: faker.image.abstract(),
+                  url: faker.image.urlLoremFlickr({ category: 'abstract' }),
                   width: 64,
                 },
               ],
diff --git a/tests/mocks/api/axios/post/leetcode.mjs b/tests/mocks/api/axios/post/leetcode.mjs
index 5b4c8c3bca1..3861fae7c89 100644
--- a/tests/mocks/api/axios/post/leetcode.mjs
+++ b/tests/mocks/api/axios/post/leetcode.mjs
@@ -64,9 +64,9 @@ export default function({faker, url, body, login = faker.internet.userName()}) {
             ],
             matchedUser: {
               problemsSolvedBeatsStats: [
-                {difficulty: "Easy", percentage: faker.datatype.float({max: 100})},
-                {difficulty: "Medium", percentage: faker.datatype.float({max: 100})},
-                {difficulty: "Hard", percentage: faker.datatype.float({max: 100})},
+                {difficulty: "Easy", percentage: faker.number.float({max: 100})},
+                {difficulty: "Medium", percentage: faker.number.float({max: 100})},
+                {difficulty: "Hard", percentage: faker.number.float({max: 100})},
               ],
               submitStatsGlobal: {
                 acSubmissionNum: [

From b148316eb3a78eb86e9e1f3f49578c8a65965894 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 24 Jul 2023 22:03:53 -0400
Subject: [PATCH 142/196] fix: revert octokit versions

---
 package-lock.json | 275 ++++++++++++++++++++++++++++++----------------
 package.json      |   4 +-
 2 files changed, 184 insertions(+), 95 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 03640485900..50eeadfce6e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,8 +13,8 @@
         "@actions/core": "^1.10.0",
         "@actions/github": "^5.1.1",
         "@faker-js/faker": "^8.0.2",
-        "@octokit/graphql": "^7.0.1",
-        "@octokit/rest": "^20.0.1",
+        "@octokit/graphql": "^5.0.5",
+        "@octokit/rest": "^19.0.7",
         "@primer/css": "^21.0.7",
         "@primer/octicons": "^19.4.0",
         "@twemoji/parser": "^14.1.0",
@@ -1523,29 +1523,29 @@
       }
     },
     "node_modules/@octokit/graphql": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz",
-      "integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==",
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz",
+      "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==",
       "dependencies": {
-        "@octokit/request": "^8.0.1",
-        "@octokit/types": "^11.0.0",
+        "@octokit/request": "^6.0.0",
+        "@octokit/types": "^9.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/endpoint": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz",
-      "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==",
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
+      "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
       "dependencies": {
-        "@octokit/types": "^11.0.0",
+        "@octokit/types": "^9.0.0",
         "is-plain-object": "^5.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": {
@@ -1554,41 +1554,80 @@
       "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw=="
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/request": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz",
-      "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==",
+      "version": "6.2.8",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
+      "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
       "dependencies": {
-        "@octokit/endpoint": "^9.0.0",
-        "@octokit/request-error": "^5.0.0",
-        "@octokit/types": "^11.1.0",
+        "@octokit/endpoint": "^7.0.0",
+        "@octokit/request-error": "^3.0.0",
+        "@octokit/types": "^9.0.0",
         "is-plain-object": "^5.0.0",
+        "node-fetch": "^2.6.7",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/request-error": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz",
-      "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
+      "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
       "dependencies": {
-        "@octokit/types": "^11.0.0",
+        "@octokit/types": "^9.0.0",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/types": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz",
-      "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==",
+      "version": "9.3.2",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+      "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
       "dependencies": {
         "@octokit/openapi-types": "^18.0.0"
       }
     },
+    "node_modules/@octokit/graphql/node_modules/node-fetch": {
+      "version": "2.6.12",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
+      "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@octokit/graphql/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
+    "node_modules/@octokit/graphql/node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    },
+    "node_modules/@octokit/graphql/node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
     "node_modules/@octokit/openapi-types": {
       "version": "12.11.0",
       "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
@@ -1605,6 +1644,14 @@
         "@octokit/core": ">=2"
       }
     },
+    "node_modules/@octokit/plugin-request-log": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
+      "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
+      "peerDependencies": {
+        "@octokit/core": ">=3"
+      }
+    },
     "node_modules/@octokit/plugin-rest-endpoint-methods": {
       "version": "5.16.2",
       "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
@@ -1679,55 +1726,55 @@
       }
     },
     "node_modules/@octokit/rest": {
-      "version": "20.0.1",
-      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz",
-      "integrity": "sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q==",
+      "version": "19.0.7",
+      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz",
+      "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==",
       "dependencies": {
-        "@octokit/core": "^5.0.0",
-        "@octokit/plugin-paginate-rest": "^8.0.0",
-        "@octokit/plugin-request-log": "^4.0.0",
-        "@octokit/plugin-rest-endpoint-methods": "^9.0.0"
+        "@octokit/core": "^4.1.0",
+        "@octokit/plugin-paginate-rest": "^6.0.0",
+        "@octokit/plugin-request-log": "^1.0.4",
+        "@octokit/plugin-rest-endpoint-methods": "^7.0.0"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/auth-token": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
-      "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz",
+      "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==",
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/core": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.0.tgz",
-      "integrity": "sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==",
-      "dependencies": {
-        "@octokit/auth-token": "^4.0.0",
-        "@octokit/graphql": "^7.0.0",
-        "@octokit/request": "^8.0.2",
-        "@octokit/request-error": "^5.0.0",
-        "@octokit/types": "^11.0.0",
+      "version": "4.2.4",
+      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz",
+      "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==",
+      "dependencies": {
+        "@octokit/auth-token": "^3.0.0",
+        "@octokit/graphql": "^5.0.0",
+        "@octokit/request": "^6.0.0",
+        "@octokit/request-error": "^3.0.0",
+        "@octokit/types": "^9.0.0",
         "before-after-hook": "^2.2.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/endpoint": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz",
-      "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==",
+      "version": "7.0.6",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
+      "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
       "dependencies": {
-        "@octokit/types": "^11.0.0",
+        "@octokit/types": "^9.0.0",
         "is-plain-object": "^5.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": {
@@ -1736,80 +1783,122 @@
       "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw=="
     },
     "node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz",
-      "integrity": "sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==",
+      "version": "6.1.2",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz",
+      "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==",
       "dependencies": {
-        "@octokit/types": "^11.0.0"
-      },
-      "engines": {
-        "node": ">= 18"
+        "@octokit/tsconfig": "^1.0.2",
+        "@octokit/types": "^9.2.3"
       },
-      "peerDependencies": {
-        "@octokit/core": ">=5"
-      }
-    },
-    "node_modules/@octokit/rest/node_modules/@octokit/plugin-request-log": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz",
-      "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==",
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       },
       "peerDependencies": {
-        "@octokit/core": ">=5"
+        "@octokit/core": ">=4"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz",
-      "integrity": "sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA==",
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz",
+      "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==",
       "dependencies": {
-        "@octokit/types": "^11.0.0"
+        "@octokit/types": "^10.0.0"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       },
       "peerDependencies": {
-        "@octokit/core": ">=5"
+        "@octokit/core": ">=3"
+      }
+    },
+    "node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
+      "version": "10.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz",
+      "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==",
+      "dependencies": {
+        "@octokit/openapi-types": "^18.0.0"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/request": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz",
-      "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==",
+      "version": "6.2.8",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
+      "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
       "dependencies": {
-        "@octokit/endpoint": "^9.0.0",
-        "@octokit/request-error": "^5.0.0",
-        "@octokit/types": "^11.1.0",
+        "@octokit/endpoint": "^7.0.0",
+        "@octokit/request-error": "^3.0.0",
+        "@octokit/types": "^9.0.0",
         "is-plain-object": "^5.0.0",
+        "node-fetch": "^2.6.7",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/request-error": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz",
-      "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
+      "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
       "dependencies": {
-        "@octokit/types": "^11.0.0",
+        "@octokit/types": "^9.0.0",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 14"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/types": {
-      "version": "11.1.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz",
-      "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==",
+      "version": "9.3.2",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
+      "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
       "dependencies": {
         "@octokit/openapi-types": "^18.0.0"
       }
     },
+    "node_modules/@octokit/rest/node_modules/node-fetch": {
+      "version": "2.6.12",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
+      "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
+      "dependencies": {
+        "whatwg-url": "^5.0.0"
+      },
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      },
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@octokit/rest/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
+    "node_modules/@octokit/rest/node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    },
+    "node_modules/@octokit/rest/node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
+    "node_modules/@octokit/tsconfig": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz",
+      "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA=="
+    },
     "node_modules/@octokit/types": {
       "version": "6.41.0",
       "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
diff --git a/package.json b/package.json
index 72d644b92c6..27a4529b40d 100644
--- a/package.json
+++ b/package.json
@@ -32,8 +32,8 @@
     "@actions/core": "^1.10.0",
     "@actions/github": "^5.1.1",
     "@faker-js/faker": "^8.0.2",
-    "@octokit/graphql": "^7.0.1",
-    "@octokit/rest": "^20.0.1",
+    "@octokit/graphql": "^5.0.5",
+    "@octokit/rest": "^19.0.7",
     "@primer/css": "^21.0.7",
     "@primer/octicons": "^19.4.0",
     "@twemoji/parser": "^14.1.0",

From 4f02045e60dacbd17dbfe3af26cac4a67287f319 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 23 Aug 2023 22:58:33 -0400
Subject: [PATCH 143/196] chore(deps): upgrade

---
 package-lock.json | 1507 ++++++++++++++++++++++-----------------------
 package.json      |   26 +-
 2 files changed, 758 insertions(+), 775 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 50eeadfce6e..10b3efd61b7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,10 +13,10 @@
         "@actions/core": "^1.10.0",
         "@actions/github": "^5.1.1",
         "@faker-js/faker": "^8.0.2",
-        "@octokit/graphql": "^5.0.5",
-        "@octokit/rest": "^19.0.7",
-        "@primer/css": "^21.0.7",
-        "@primer/octicons": "^19.4.0",
+        "@octokit/graphql": "^7.0.1",
+        "@octokit/rest": "^20.0.1",
+        "@primer/css": "^21.0.8",
+        "@primer/octicons": "^19.6.0",
         "@twemoji/parser": "^14.1.0",
         "axios": "^1.4.0",
         "clipboard": "^2.0.11",
@@ -26,36 +26,36 @@
         "ejs": "^3.1.9",
         "emoji-name-map": "^1.2.9",
         "express": "^4.18.2",
-        "express-rate-limit": "^6.8.0",
+        "express-rate-limit": "^6.9.0",
         "file-type": "^18.5.0",
         "js-yaml": "^4.1.0",
         "jsdom": "^22.1.0",
         "linguist-js": "^2.6.1",
-        "marked": "^5.1.1",
+        "marked": "^7.0.4",
         "memory-cache": "^0.2.0",
         "minimatch": "^9.0.3",
-        "node-fetch": "^3.3.1",
+        "node-fetch": "^3.3.2",
         "open-graph-scraper": "^6.2.2",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^20.9.0",
+        "puppeteer": "^21.1.0",
         "purgecss": "^5.0.0",
         "rss-parser": "^3.13.0",
         "sanitize-html": "^2.11.0",
-        "sharp": "^0.32.4",
+        "sharp": "^0.32.5",
         "simple-git": "^3.19.1",
         "svgo": "^3.0.2",
         "vue": "^2.7.1",
         "vue-prism-component": "^1.2.0",
-        "xml-formatter": "^3.4.1"
+        "xml-formatter": "^3.5.0"
       },
       "devDependencies": {
         "dprint": "^0.35.1",
-        "eslint": "^8.45.0",
-        "jest": "^29.6.1"
+        "eslint": "^8.47.0",
+        "jest": "^29.6.3"
       },
       "optionalDependencies": {
-        "@googlemaps/google-maps-services-js": "^3.3.34",
+        "@googlemaps/google-maps-services-js": "^3.3.36",
         "chess.js": "^1.0.0-beta.6",
         "color": "^4.2.3",
         "gifencoder": "^2.0.1",
@@ -115,16 +115,81 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
-      "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+      "version": "7.22.10",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz",
+      "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==",
       "dependencies": {
-        "@babel/highlight": "^7.22.5"
+        "@babel/highlight": "^7.22.10",
+        "chalk": "^2.4.2"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@babel/code-frame/node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+    },
+    "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/code-frame/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
     "node_modules/@babel/compat-data": {
       "version": "7.22.9",
       "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz",
@@ -135,21 +200,21 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.22.9",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz",
-      "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==",
+      "version": "7.22.10",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz",
+      "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==",
       "dev": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.22.5",
-        "@babel/generator": "^7.22.9",
-        "@babel/helper-compilation-targets": "^7.22.9",
+        "@babel/code-frame": "^7.22.10",
+        "@babel/generator": "^7.22.10",
+        "@babel/helper-compilation-targets": "^7.22.10",
         "@babel/helper-module-transforms": "^7.22.9",
-        "@babel/helpers": "^7.22.6",
-        "@babel/parser": "^7.22.7",
+        "@babel/helpers": "^7.22.10",
+        "@babel/parser": "^7.22.10",
         "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.8",
-        "@babel/types": "^7.22.5",
+        "@babel/traverse": "^7.22.10",
+        "@babel/types": "^7.22.10",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -180,12 +245,12 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.22.9",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz",
-      "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==",
+      "version": "7.22.10",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz",
+      "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.5",
+        "@babel/types": "^7.22.10",
         "@jridgewell/gen-mapping": "^0.3.2",
         "@jridgewell/trace-mapping": "^0.3.17",
         "jsesc": "^2.5.1"
@@ -195,9 +260,9 @@
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.22.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz",
-      "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==",
+      "version": "7.22.10",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz",
+      "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==",
       "dev": true,
       "dependencies": {
         "@babel/compat-data": "^7.22.9",
@@ -208,9 +273,6 @@
       },
       "engines": {
         "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
       }
     },
     "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
@@ -347,26 +409,26 @@
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.22.6",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz",
-      "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==",
+      "version": "7.22.10",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz",
+      "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==",
       "dev": true,
       "dependencies": {
         "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.6",
-        "@babel/types": "^7.22.5"
+        "@babel/traverse": "^7.22.10",
+        "@babel/types": "^7.22.10"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
-      "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
+      "version": "7.22.10",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz",
+      "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==",
       "dependencies": {
         "@babel/helper-validator-identifier": "^7.22.5",
-        "chalk": "^2.0.0",
+        "chalk": "^2.4.2",
         "js-tokens": "^4.0.0"
       },
       "engines": {
@@ -438,9 +500,9 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.22.7",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz",
-      "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==",
+      "version": "7.22.10",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz",
+      "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -640,19 +702,19 @@
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.22.8",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz",
-      "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==",
+      "version": "7.22.10",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz",
+      "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==",
       "dev": true,
       "dependencies": {
-        "@babel/code-frame": "^7.22.5",
-        "@babel/generator": "^7.22.7",
+        "@babel/code-frame": "^7.22.10",
+        "@babel/generator": "^7.22.10",
         "@babel/helper-environment-visitor": "^7.22.5",
         "@babel/helper-function-name": "^7.22.5",
         "@babel/helper-hoist-variables": "^7.22.5",
         "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/parser": "^7.22.7",
-        "@babel/types": "^7.22.5",
+        "@babel/parser": "^7.22.10",
+        "@babel/types": "^7.22.10",
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       },
@@ -670,9 +732,9 @@
       }
     },
     "node_modules/@babel/types": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
-      "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
+      "version": "7.22.10",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz",
+      "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==",
       "dev": true,
       "dependencies": {
         "@babel/helper-string-parser": "^7.22.5",
@@ -705,18 +767,18 @@
       }
     },
     "node_modules/@eslint-community/regexpp": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz",
-      "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==",
+      "version": "4.7.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.7.0.tgz",
+      "integrity": "sha512-+HencqxU7CFJnQb7IKtuNBqS6Yx3Tz4kOL8BJXo+JyeiBm5MEX6pO8onXDkjrkCRlfYXS1Axro15ZjVFe9YgsA==",
       "dev": true,
       "engines": {
         "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
       }
     },
     "node_modules/@eslint/eslintrc": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz",
-      "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
+      "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
       "dev": true,
       "dependencies": {
         "ajv": "^6.12.4",
@@ -759,9 +821,9 @@
       }
     },
     "node_modules/@eslint/js": {
-      "version": "8.44.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
-      "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
+      "version": "8.47.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz",
+      "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -783,24 +845,19 @@
       }
     },
     "node_modules/@github/auto-check-element": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/@github/auto-check-element/-/auto-check-element-5.2.0.tgz",
-      "integrity": "sha512-YODZZUSeoZVJQ04p73MAohrEK37SJlVRDUTaFiPYse9K3z3bNEm+ekq5qYCIyDKGgX7hUhr3WZF35qHxr/zu0Q==",
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/@github/auto-check-element/-/auto-check-element-5.4.1.tgz",
+      "integrity": "sha512-AJeHV1ifpby5Hp2wJIzcsdIB5YAq869F7ilNv2GygTVpHOSCfYSS29/hJ5GGTLgfKpPRgTmJcMi5OetKR8eH1g==",
       "dependencies": {
-        "@github/mini-throttle": "^1.0.7"
+        "@github/mini-throttle": "^2.1.0"
       }
     },
-    "node_modules/@github/auto-check-element/node_modules/@github/mini-throttle": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-1.0.7.tgz",
-      "integrity": "sha512-1fzCDXpxI4J59pNmO0r0Y1g+R8Sa2B5ersce8AuFu5STMu7b++9osdedK0zWduYowBIgsPQZihJBN19WrAF64g=="
-    },
     "node_modules/@github/auto-complete-element": {
-      "version": "3.4.0",
-      "resolved": "https://registry.npmjs.org/@github/auto-complete-element/-/auto-complete-element-3.4.0.tgz",
-      "integrity": "sha512-iJ5D/0rwhPnoGPqFNWhY5NlJlxZKt/lMnIRuL6TRfJqu4ieDApWQdcVfJ0yPRDKAzJqmb0MgMkOtH84ZBLu9og==",
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@github/auto-complete-element/-/auto-complete-element-3.5.1.tgz",
+      "integrity": "sha512-7/g6Nz6Zz4/k0m/L0n+OEO29WZcXgXwLJn7Ql02UbIMR2ClFEZIwIvvzb+3fEECOyLpFrZC/JH7Svz9RYPc+wA==",
       "dependencies": {
-        "@github/combobox-nav": "^2.0.2"
+        "@github/combobox-nav": "^2.1.7"
       }
     },
     "node_modules/@github/catalyst": {
@@ -809,9 +866,9 @@
       "integrity": "sha512-u8A+DameixqpeyHzvnJWTGj+wfiskQOYHzSiJscCWVfMkIT3rxnbHMtGh3lMthaRY21nbUOK71WcsCnCrXhBJQ=="
     },
     "node_modules/@github/clipboard-copy-element": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.1.2.tgz",
-      "integrity": "sha512-L6CMrcA5we0udafvoSuRCE/Ci/3xrLWKYRGup2IlhxF771bQYsQ2EB1of182pI8ZWM4oxgwzu37+igMeoZjN/A=="
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@github/clipboard-copy-element/-/clipboard-copy-element-1.2.1.tgz",
+      "integrity": "sha512-PLccyUCnzmOQ6zrRsH66rr67iumJyP5r7ij17ezprFQAK/oA8CXhlC8LTG+xpW3cYAvnp2zCgRNTfXS8wk09Lg=="
     },
     "node_modules/@github/combobox-nav": {
       "version": "2.1.7",
@@ -828,25 +885,30 @@
       "resolved": "https://registry.npmjs.org/@github/image-crop-element/-/image-crop-element-5.0.0.tgz",
       "integrity": "sha512-Vgm2OwWAs1ESoib/t5sjxsAYo6YTOxxAjWDRxswX7qrqoyCejTZ3hshdo4Ep5e+Mz/GVTZC3rdMtg06dk/eT4g=="
     },
+    "node_modules/@github/include-fragment-element": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/@github/include-fragment-element/-/include-fragment-element-6.3.0.tgz",
+      "integrity": "sha512-BJTt8ZE/arsbC9lQtTH8c1hZS0ZigiN+kzH54ffQ6MhHLT83h0OpSdS9NEVocPl2uuO6w3qxnEKTDzUGMQ5rdQ=="
+    },
     "node_modules/@github/mini-throttle": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-2.1.0.tgz",
-      "integrity": "sha512-iEeR2OdVCPkdIPUszL8gJnKNu4MR8ANh7y0u/LPyaatYezgaWxUZEzhFntloqQq+HE6MZkFy+cl+xzCNuljOdw=="
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@github/mini-throttle/-/mini-throttle-2.1.1.tgz",
+      "integrity": "sha512-KtOPaB+FiKJ6jcKm9UKyaM5fPURHGf+xcp+b4Mzoi81hOc6M1sIGpMZMAVbNzfa2lW5+RPGKq888Px0j76OZ/A=="
     },
     "node_modules/@github/relative-time-element": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.2.4.tgz",
-      "integrity": "sha512-18qgH9FYUHYN9K3z4s35auDHww1dKTU6TacI8JkA5OuvHVa1lTMuSTZ4hIoJngD5+mizcoRMOs6p/yZYMIjsyg=="
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/@github/relative-time-element/-/relative-time-element-4.3.0.tgz",
+      "integrity": "sha512-+tFjX9//HRS1HnBa5cNgfEtE52arwiutYg1TOF+Trk40SPxst9Q8Rtc3BKD6aKsvfbtub68vfhipgchGjj9o7g=="
     },
     "node_modules/@github/tab-container-element": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/@github/tab-container-element/-/tab-container-element-3.2.0.tgz",
-      "integrity": "sha512-to5ZJuywKK3KX53X1ifOcWjvUTQcBGdQ6Qkhm8L97xQ3ovICag1048M3YMpc+QSdr8xWeCBMnLeMnENqotB0Og=="
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/@github/tab-container-element/-/tab-container-element-3.3.0.tgz",
+      "integrity": "sha512-vHlN/GXgaJFJhh4oUYRh1pc4RAqduKlQOrEjVgSxR4JhLXsQcZ/hKWfCsRZAuZbSPzUGEYvggdieamS4FRSe4g=="
     },
     "node_modules/@googlemaps/google-maps-services-js": {
-      "version": "3.3.34",
-      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.34.tgz",
-      "integrity": "sha512-tx9pVpYmgleU5+oos6UGV9pshDkhZH0veCSZmjJpUhULIxTu5LbyTjNsIwbeLQmJW1/Pzph4lKsohsmx0Xu9pQ==",
+      "version": "3.3.36",
+      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.36.tgz",
+      "integrity": "sha512-tv9o6/X9l/sytiBiLNAS80DTTDzHBylg0Zsdv846XnkyYyhdaleqFt+D6lh3V9lrcC+YSwnVKaBhDx/weGcMLg==",
       "optional": true,
       "dependencies": {
         "@googlemaps/url-signature": "^1.0.4",
@@ -1039,16 +1101,16 @@
       }
     },
     "node_modules/@jest/console": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.1.tgz",
-      "integrity": "sha512-Aj772AYgwTSr5w8qnyoJ0eDYvN6bMsH3ORH1ivMotrInHLKdUz6BDlaEXHdM6kODaBIkNIyQGzsMvRdOv7VG7Q==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.3.tgz",
+      "integrity": "sha512-ukZbHAdDH4ktZIOKvWs1juAXhiVAdvCyM8zv4S/7Ii3vJSDvMW5k+wOVGMQmHLHUFw3Ko63ZQNy7NI6PSlsD5w==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.6.1",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
-        "jest-message-util": "^29.6.1",
-        "jest-util": "^29.6.1",
+        "jest-message-util": "^29.6.3",
+        "jest-util": "^29.6.3",
         "slash": "^3.0.0"
       },
       "engines": {
@@ -1056,37 +1118,37 @@
       }
     },
     "node_modules/@jest/core": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.1.tgz",
-      "integrity": "sha512-CcowHypRSm5oYQ1obz1wfvkjZZ2qoQlrKKvlfPwh5jUXVU12TWr2qMeH8chLMuTFzHh5a1g2yaqlqDICbr+ukQ==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.3.tgz",
+      "integrity": "sha512-skV1XrfNxfagmjRUrk2FyN5/2YwIzdWVVBa/orUfbLvQUANXxERq2pTvY0I+FinWHjDKB2HRmpveUiph4X0TJw==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.6.1",
-        "@jest/reporters": "^29.6.1",
-        "@jest/test-result": "^29.6.1",
-        "@jest/transform": "^29.6.1",
-        "@jest/types": "^29.6.1",
+        "@jest/console": "^29.6.3",
+        "@jest/reporters": "^29.6.3",
+        "@jest/test-result": "^29.6.3",
+        "@jest/transform": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
-        "jest-changed-files": "^29.5.0",
-        "jest-config": "^29.6.1",
-        "jest-haste-map": "^29.6.1",
-        "jest-message-util": "^29.6.1",
-        "jest-regex-util": "^29.4.3",
-        "jest-resolve": "^29.6.1",
-        "jest-resolve-dependencies": "^29.6.1",
-        "jest-runner": "^29.6.1",
-        "jest-runtime": "^29.6.1",
-        "jest-snapshot": "^29.6.1",
-        "jest-util": "^29.6.1",
-        "jest-validate": "^29.6.1",
-        "jest-watcher": "^29.6.1",
+        "jest-changed-files": "^29.6.3",
+        "jest-config": "^29.6.3",
+        "jest-haste-map": "^29.6.3",
+        "jest-message-util": "^29.6.3",
+        "jest-regex-util": "^29.6.3",
+        "jest-resolve": "^29.6.3",
+        "jest-resolve-dependencies": "^29.6.3",
+        "jest-runner": "^29.6.3",
+        "jest-runtime": "^29.6.3",
+        "jest-snapshot": "^29.6.3",
+        "jest-util": "^29.6.3",
+        "jest-validate": "^29.6.3",
+        "jest-watcher": "^29.6.3",
         "micromatch": "^4.0.4",
-        "pretty-format": "^29.6.1",
+        "pretty-format": "^29.6.3",
         "slash": "^3.0.0",
         "strip-ansi": "^6.0.0"
       },
@@ -1103,88 +1165,88 @@
       }
     },
     "node_modules/@jest/environment": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.1.tgz",
-      "integrity": "sha512-RMMXx4ws+Gbvw3DfLSuo2cfQlK7IwGbpuEWXCqyYDcqYTI+9Ju3a5hDnXaxjNsa6uKh9PQF2v+qg+RLe63tz5A==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.3.tgz",
+      "integrity": "sha512-u/u3cCztYCfgBiGHsamqP5x+XvucftOGPbf5RJQxfpeC1y4AL8pCjKvPDA3oCmdhZYPgk5AE0VOD/flweR69WA==",
       "dev": true,
       "dependencies": {
-        "@jest/fake-timers": "^29.6.1",
-        "@jest/types": "^29.6.1",
+        "@jest/fake-timers": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
-        "jest-mock": "^29.6.1"
+        "jest-mock": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/expect": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.1.tgz",
-      "integrity": "sha512-N5xlPrAYaRNyFgVf2s9Uyyvr795jnB6rObuPx4QFvNJz8aAjpZUDfO4bh5G/xuplMID8PrnuF1+SfSyDxhsgYg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.3.tgz",
+      "integrity": "sha512-Ic08XbI2jlg6rECy+CGwk/8NDa6VE7UmIG6++9OTPAMnQmNGY28hu69Nf629CWv6T7YMODLbONxDFKdmQeI9FA==",
       "dev": true,
       "dependencies": {
-        "expect": "^29.6.1",
-        "jest-snapshot": "^29.6.1"
+        "expect": "^29.6.3",
+        "jest-snapshot": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/expect-utils": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz",
-      "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.3.tgz",
+      "integrity": "sha512-nvOEW4YoqRKD9HBJ9OJ6przvIvP9qilp5nAn1462P5ZlL/MM9SgPEZFyjTGPfs7QkocdUsJa6KjHhyRn4ueItA==",
       "dev": true,
       "dependencies": {
-        "jest-get-type": "^29.4.3"
+        "jest-get-type": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/fake-timers": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.1.tgz",
-      "integrity": "sha512-RdgHgbXyosCDMVYmj7lLpUwXA4c69vcNzhrt69dJJdf8azUrpRh3ckFCaTPNjsEeRi27Cig0oKDGxy5j7hOgHg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.3.tgz",
+      "integrity": "sha512-pa1wmqvbj6eX0nMvOM2VDAWvJOI5A/Mk3l8O7n7EsAh71sMZblaKO9iT4GjIj0LwwK3CP/Jp1ypEV0x3m89RvA==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.6.1",
+        "@jest/types": "^29.6.3",
         "@sinonjs/fake-timers": "^10.0.2",
         "@types/node": "*",
-        "jest-message-util": "^29.6.1",
-        "jest-mock": "^29.6.1",
-        "jest-util": "^29.6.1"
+        "jest-message-util": "^29.6.3",
+        "jest-mock": "^29.6.3",
+        "jest-util": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/globals": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.1.tgz",
-      "integrity": "sha512-2VjpaGy78JY9n9370H8zGRCFbYVWwjY6RdDMhoJHa1sYfwe6XM/azGN0SjY8kk7BOZApIejQ1BFPyH7FPG0w3A==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.3.tgz",
+      "integrity": "sha512-RB+uI+CZMHntzlnOPlll5x/jgRff3LEPl/td/jzMXiIgR0iIhKq9qm1HLU+EC52NuoVy/1swit/sDGjVn4bc6A==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.1",
-        "@jest/expect": "^29.6.1",
-        "@jest/types": "^29.6.1",
-        "jest-mock": "^29.6.1"
+        "@jest/environment": "^29.6.3",
+        "@jest/expect": "^29.6.3",
+        "@jest/types": "^29.6.3",
+        "jest-mock": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/reporters": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.1.tgz",
-      "integrity": "sha512-9zuaI9QKr9JnoZtFQlw4GREQbxgmNYXU6QuWtmuODvk5nvPUeBYapVR/VYMyi2WSx3jXTLJTJji8rN6+Cm4+FA==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.3.tgz",
+      "integrity": "sha512-kGz59zMi0GkVjD2CJeYWG9k6cvj7eBqt9aDAqo2rcCLRTYlvQ62Gu/n+tOmJMBHGjzeijjuCENjzTyYBgrtLUw==",
       "dev": true,
       "dependencies": {
         "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^29.6.1",
-        "@jest/test-result": "^29.6.1",
-        "@jest/transform": "^29.6.1",
-        "@jest/types": "^29.6.1",
+        "@jest/console": "^29.6.3",
+        "@jest/test-result": "^29.6.3",
+        "@jest/transform": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "@jridgewell/trace-mapping": "^0.3.18",
         "@types/node": "*",
         "chalk": "^4.0.0",
@@ -1193,13 +1255,13 @@
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
         "istanbul-lib-coverage": "^3.0.0",
-        "istanbul-lib-instrument": "^5.1.0",
+        "istanbul-lib-instrument": "^6.0.0",
         "istanbul-lib-report": "^3.0.0",
         "istanbul-lib-source-maps": "^4.0.0",
         "istanbul-reports": "^3.1.3",
-        "jest-message-util": "^29.6.1",
-        "jest-util": "^29.6.1",
-        "jest-worker": "^29.6.1",
+        "jest-message-util": "^29.6.3",
+        "jest-util": "^29.6.3",
+        "jest-worker": "^29.6.3",
         "slash": "^3.0.0",
         "string-length": "^4.0.1",
         "strip-ansi": "^6.0.0",
@@ -1218,9 +1280,9 @@
       }
     },
     "node_modules/@jest/schemas": {
-      "version": "29.6.0",
-      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz",
-      "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+      "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
       "dev": true,
       "dependencies": {
         "@sinclair/typebox": "^0.27.8"
@@ -1230,9 +1292,9 @@
       }
     },
     "node_modules/@jest/source-map": {
-      "version": "29.6.0",
-      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.0.tgz",
-      "integrity": "sha512-oA+I2SHHQGxDCZpbrsCQSoMLb3Bz547JnM+jUr9qEbuw0vQlWZfpPS7CO9J7XiwKicEz9OFn/IYoLkkiUD7bzA==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+      "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
       "dev": true,
       "dependencies": {
         "@jridgewell/trace-mapping": "^0.3.18",
@@ -1244,13 +1306,13 @@
       }
     },
     "node_modules/@jest/test-result": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.1.tgz",
-      "integrity": "sha512-Ynr13ZRcpX6INak0TPUukU8GWRfm/vAytE3JbJNGAvINySWYdfE7dGZMbk36oVuK4CigpbhMn8eg1dixZ7ZJOw==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.3.tgz",
+      "integrity": "sha512-k7ZZaNvOSMBHPZYiy0kuiaFoyansR5QnTwDux1EjK3kD5iWpRVyJIJ0RAIV39SThafchuW59vra7F8mdy5Hfgw==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.6.1",
-        "@jest/types": "^29.6.1",
+        "@jest/console": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "@types/istanbul-lib-coverage": "^2.0.0",
         "collect-v8-coverage": "^1.0.0"
       },
@@ -1259,14 +1321,14 @@
       }
     },
     "node_modules/@jest/test-sequencer": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.1.tgz",
-      "integrity": "sha512-oBkC36PCDf/wb6dWeQIhaviU0l5u6VCsXa119yqdUosYAt7/FbQU2M2UoziO3igj/HBDEgp57ONQ3fm0v9uyyg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.3.tgz",
+      "integrity": "sha512-/SmijaAU2TY9ComFGIYa6Z+fmKqQMnqs2Nmwb0P/Z/tROdZ7M0iruES1EaaU9PBf8o9uED5xzaJ3YPFEIcDgAg==",
       "dev": true,
       "dependencies": {
-        "@jest/test-result": "^29.6.1",
+        "@jest/test-result": "^29.6.3",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.1",
+        "jest-haste-map": "^29.6.3",
         "slash": "^3.0.0"
       },
       "engines": {
@@ -1274,22 +1336,22 @@
       }
     },
     "node_modules/@jest/transform": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.1.tgz",
-      "integrity": "sha512-URnTneIU3ZjRSaf906cvf6Hpox3hIeJXRnz3VDSw5/X93gR8ycdfSIEy19FlVx8NFmpN7fe3Gb1xF+NjXaQLWg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.3.tgz",
+      "integrity": "sha512-dPIc3DsvMZ/S8ut4L2ViCj265mKO0owB0wfzBv2oGzL9pQ+iRvJewHqLBmsGb7XFb5UotWIEtvY5A/lnylaIoQ==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
-        "@jest/types": "^29.6.1",
+        "@jest/types": "^29.6.3",
         "@jridgewell/trace-mapping": "^0.3.18",
         "babel-plugin-istanbul": "^6.1.1",
         "chalk": "^4.0.0",
         "convert-source-map": "^2.0.0",
         "fast-json-stable-stringify": "^2.1.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.1",
-        "jest-regex-util": "^29.4.3",
-        "jest-util": "^29.6.1",
+        "jest-haste-map": "^29.6.3",
+        "jest-regex-util": "^29.6.3",
+        "jest-util": "^29.6.3",
         "micromatch": "^4.0.4",
         "pirates": "^4.0.4",
         "slash": "^3.0.0",
@@ -1300,12 +1362,12 @@
       }
     },
     "node_modules/@jest/types": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz",
-      "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+      "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
       "dev": true,
       "dependencies": {
-        "@jest/schemas": "^29.6.0",
+        "@jest/schemas": "^29.6.3",
         "@types/istanbul-lib-coverage": "^2.0.0",
         "@types/istanbul-reports": "^3.0.0",
         "@types/node": "*",
@@ -1331,9 +1393,9 @@
       }
     },
     "node_modules/@jridgewell/resolve-uri": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
-      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+      "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
       "dev": true,
       "engines": {
         "node": ">=6.0.0"
@@ -1355,21 +1417,15 @@
       "dev": true
     },
     "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.18",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
-      "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
+      "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
       "dev": true,
       "dependencies": {
-        "@jridgewell/resolve-uri": "3.1.0",
-        "@jridgewell/sourcemap-codec": "1.4.14"
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
       }
     },
-    "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
-      "version": "1.4.14",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
-      "dev": true
-    },
     "node_modules/@kwsites/file-exists": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
@@ -1523,29 +1579,29 @@
       }
     },
     "node_modules/@octokit/graphql": {
-      "version": "5.0.5",
-      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz",
-      "integrity": "sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ==",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.1.tgz",
+      "integrity": "sha512-T5S3oZ1JOE58gom6MIcrgwZXzTaxRnxBso58xhozxHpOqSTgDS6YNeEUvZ/kRvXgPrRz/KHnZhtb7jUMRi9E6w==",
       "dependencies": {
-        "@octokit/request": "^6.0.0",
-        "@octokit/types": "^9.0.0",
+        "@octokit/request": "^8.0.1",
+        "@octokit/types": "^11.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/endpoint": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
-      "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz",
+      "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^11.0.0",
         "is-plain-object": "^5.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/openapi-types": {
@@ -1554,80 +1610,41 @@
       "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw=="
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/request": {
-      "version": "6.2.8",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
-      "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz",
+      "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==",
       "dependencies": {
-        "@octokit/endpoint": "^7.0.0",
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^9.0.0",
+        "@octokit/endpoint": "^9.0.0",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^11.1.0",
         "is-plain-object": "^5.0.0",
-        "node-fetch": "^2.6.7",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/request-error": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
-      "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz",
+      "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^11.0.0",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/graphql/node_modules/@octokit/types": {
-      "version": "9.3.2",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
-      "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz",
+      "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==",
       "dependencies": {
         "@octokit/openapi-types": "^18.0.0"
       }
     },
-    "node_modules/@octokit/graphql/node_modules/node-fetch": {
-      "version": "2.6.12",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
-      "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@octokit/graphql/node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
-    "node_modules/@octokit/graphql/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-    },
-    "node_modules/@octokit/graphql/node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
     "node_modules/@octokit/openapi-types": {
       "version": "12.11.0",
       "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
@@ -1644,14 +1661,6 @@
         "@octokit/core": ">=2"
       }
     },
-    "node_modules/@octokit/plugin-request-log": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz",
-      "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==",
-      "peerDependencies": {
-        "@octokit/core": ">=3"
-      }
-    },
     "node_modules/@octokit/plugin-rest-endpoint-methods": {
       "version": "5.16.2",
       "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
@@ -1726,55 +1735,55 @@
       }
     },
     "node_modules/@octokit/rest": {
-      "version": "19.0.7",
-      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.7.tgz",
-      "integrity": "sha512-HRtSfjrWmWVNp2uAkEpQnuGMJsu/+dBr47dRc5QVgsCbnIc1+GFEaoKBWkYG+zjrsHpSqcAElMio+n10c0b5JA==",
+      "version": "20.0.1",
+      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz",
+      "integrity": "sha512-wROV21RwHQIMNb2Dgd4+pY+dVy1Dwmp85pBrgr6YRRDYRBu9Gb+D73f4Bl2EukZSj5hInq2Tui9o7gAQpc2k2Q==",
       "dependencies": {
-        "@octokit/core": "^4.1.0",
-        "@octokit/plugin-paginate-rest": "^6.0.0",
-        "@octokit/plugin-request-log": "^1.0.4",
-        "@octokit/plugin-rest-endpoint-methods": "^7.0.0"
+        "@octokit/core": "^5.0.0",
+        "@octokit/plugin-paginate-rest": "^8.0.0",
+        "@octokit/plugin-request-log": "^4.0.0",
+        "@octokit/plugin-rest-endpoint-methods": "^9.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/auth-token": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz",
-      "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
+      "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/core": {
-      "version": "4.2.4",
-      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz",
-      "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==",
-      "dependencies": {
-        "@octokit/auth-token": "^3.0.0",
-        "@octokit/graphql": "^5.0.0",
-        "@octokit/request": "^6.0.0",
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^9.0.0",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.0.0.tgz",
+      "integrity": "sha512-YbAtMWIrbZ9FCXbLwT9wWB8TyLjq9mxpKdgB3dUNxQcIVTf9hJ70gRPwAcqGZdY6WdJPZ0I7jLaaNDCiloGN2A==",
+      "dependencies": {
+        "@octokit/auth-token": "^4.0.0",
+        "@octokit/graphql": "^7.0.0",
+        "@octokit/request": "^8.0.2",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^11.0.0",
         "before-after-hook": "^2.2.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/endpoint": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz",
-      "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==",
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.0.tgz",
+      "integrity": "sha512-szrQhiqJ88gghWY2Htt8MqUDO6++E/EIXqJ2ZEp5ma3uGS46o7LZAzSLt49myB7rT+Hfw5Y6gO3LmOxGzHijAQ==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^11.0.0",
         "is-plain-object": "^5.0.0",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": {
@@ -1783,122 +1792,80 @@
       "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw=="
     },
     "node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": {
-      "version": "6.1.2",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz",
-      "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==",
+      "version": "8.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-8.0.0.tgz",
+      "integrity": "sha512-2xZ+baZWUg+qudVXnnvXz7qfrTmDeYPCzangBVq/1gXxii/OiS//4shJp9dnCCvj1x+JAm9ji1Egwm1BA47lPQ==",
       "dependencies": {
-        "@octokit/tsconfig": "^1.0.2",
-        "@octokit/types": "^9.2.3"
+        "@octokit/types": "^11.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       },
       "peerDependencies": {
-        "@octokit/core": ">=4"
+        "@octokit/core": ">=5"
       }
     },
-    "node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": {
-      "version": "7.2.3",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz",
-      "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==",
-      "dependencies": {
-        "@octokit/types": "^10.0.0"
-      },
+    "node_modules/@octokit/rest/node_modules/@octokit/plugin-request-log": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.0.tgz",
+      "integrity": "sha512-2uJI1COtYCq8Z4yNSnM231TgH50bRkheQ9+aH8TnZanB6QilOnx8RMD2qsnamSOXtDj0ilxvevf5fGsBhBBzKA==",
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       },
       "peerDependencies": {
-        "@octokit/core": ">=3"
+        "@octokit/core": ">=5"
       }
     },
-    "node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
-      "version": "10.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz",
-      "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==",
+    "node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-9.0.0.tgz",
+      "integrity": "sha512-KquMF/VB1IkKNiVnzJKspY5mFgGyLd7HzdJfVEGTJFzqu9BRFNWt+nwTCMuUiWc72gLQhRWYubTwOkQj+w/1PA==",
       "dependencies": {
-        "@octokit/openapi-types": "^18.0.0"
+        "@octokit/types": "^11.0.0"
+      },
+      "engines": {
+        "node": ">= 18"
+      },
+      "peerDependencies": {
+        "@octokit/core": ">=5"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/request": {
-      "version": "6.2.8",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz",
-      "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==",
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.1.tgz",
+      "integrity": "sha512-8N+tdUz4aCqQmXl8FpHYfKG9GelDFd7XGVzyN8rc6WxVlYcfpHECnuRkgquzz+WzvHTK62co5di8gSXnzASZPQ==",
       "dependencies": {
-        "@octokit/endpoint": "^7.0.0",
-        "@octokit/request-error": "^3.0.0",
-        "@octokit/types": "^9.0.0",
+        "@octokit/endpoint": "^9.0.0",
+        "@octokit/request-error": "^5.0.0",
+        "@octokit/types": "^11.1.0",
         "is-plain-object": "^5.0.0",
-        "node-fetch": "^2.6.7",
         "universal-user-agent": "^6.0.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/request-error": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz",
-      "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.0.tgz",
+      "integrity": "sha512-1ue0DH0Lif5iEqT52+Rf/hf0RmGO9NWFjrzmrkArpG9trFfDM/efx00BJHdLGuro4BR/gECxCU2Twf5OKrRFsQ==",
       "dependencies": {
-        "@octokit/types": "^9.0.0",
+        "@octokit/types": "^11.0.0",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       },
       "engines": {
-        "node": ">= 14"
+        "node": ">= 18"
       }
     },
     "node_modules/@octokit/rest/node_modules/@octokit/types": {
-      "version": "9.3.2",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz",
-      "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==",
+      "version": "11.1.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-11.1.0.tgz",
+      "integrity": "sha512-Fz0+7GyLm/bHt8fwEqgvRBWwIV1S6wRRyq+V6exRKLVWaKGsuy6H9QFYeBVDV7rK6fO3XwHgQOPxv+cLj2zpXQ==",
       "dependencies": {
         "@octokit/openapi-types": "^18.0.0"
       }
     },
-    "node_modules/@octokit/rest/node_modules/node-fetch": {
-      "version": "2.6.12",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
-      "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@octokit/rest/node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
-    "node_modules/@octokit/rest/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-    },
-    "node_modules/@octokit/rest/node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
-    "node_modules/@octokit/tsconfig": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz",
-      "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA=="
-    },
     "node_modules/@octokit/types": {
       "version": "6.41.0",
       "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
@@ -1908,44 +1875,44 @@
       }
     },
     "node_modules/@oddbird/popover-polyfill": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/@oddbird/popover-polyfill/-/popover-polyfill-0.0.10.tgz",
-      "integrity": "sha512-jkfX/35EsxDe9ruTx3He59FyE+y5WDF5S4YJ7TABj0c8egHV2FLeADavknvr12CnSu0QTybv9ufKfPJDsYZYNw=="
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/@oddbird/popover-polyfill/-/popover-polyfill-0.2.2.tgz",
+      "integrity": "sha512-ko7x+PDZA9bHwA6hSfxjL1IhBP91JukfZq/NAe85u9rT0akFn9RKvSXymX/mS7S2mfNjE+Zw9JdLUPGvPabQAA=="
     },
     "node_modules/@primer/behaviors": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.3.tgz",
-      "integrity": "sha512-iHMRuu8YWDJIdqCi1krx0cyFNeqszNKTOb0dXFu2wQ5BeIqxqPJLD7rjZ2Vjf/+YaPSbWuIQE1H6TaGMMsDfdA=="
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/@primer/behaviors/-/behaviors-1.3.5.tgz",
+      "integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg=="
     },
     "node_modules/@primer/css": {
-      "version": "21.0.7",
-      "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.7.tgz",
-      "integrity": "sha512-Iq0VkpLVZqHZTo2JOIv+RPVu3bWj/BU/MIZrNZ4GRTJTY0YFQ/YCmUYKY1swgiCiPF/RKew5xIkf1cWaqtkQEA==",
+      "version": "21.0.8",
+      "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.8.tgz",
+      "integrity": "sha512-nyJnLwNvqZKN9t2ho0ccTKV5Z9QOQayZT+lycWCwkPmNOyMfGlod8mLFHLYd80Ea7H5784QeOl2+3gh710Yt/g==",
       "dependencies": {
-        "@primer/primitives": "^7.11.12",
-        "@primer/view-components": "^0.1.0"
+        "@primer/primitives": "^7.12.0",
+        "@primer/view-components": "^0.5.1"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+        "node": ">=16.0.0"
       }
     },
     "node_modules/@primer/octicons": {
-      "version": "19.4.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.4.0.tgz",
-      "integrity": "sha512-92eXALm3ucZkzqpJmJbC+fR9ldiuNd4W4s2MZQNQIBahpg14emJ+I9fdHqCummFlfgyohLzXn++7rz0NlkqAJA==",
+      "version": "19.6.0",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.6.0.tgz",
+      "integrity": "sha512-/10tz0hyJijS9hCLKw5Wb3LfRmVSQjtiUDPfvf582bhe+/xZDybgf3VLJncD5SZaetC4zNhz31VwV8nnG2PdSQ==",
       "dependencies": {
         "object-assign": "^4.1.1"
       }
     },
     "node_modules/@primer/primitives": {
-      "version": "7.11.14",
-      "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.11.14.tgz",
-      "integrity": "sha512-z/yUTEkbGhvFqoJ8rpLz3pHJfLNRdoyNd/xNdAl/LKqA97Z60tsSVJMfxNMXi3aS9dCIC1dexK5/Gp4y9JrRkg=="
+      "version": "7.12.0",
+      "resolved": "https://registry.npmjs.org/@primer/primitives/-/primitives-7.12.0.tgz",
+      "integrity": "sha512-QKNxfWm7Ik1Ulswyp3KeUL2xnQj8i0E7DdB6lOrh29o7LgyuutwcOHi4CGapBIOR1fYURu+yROSTHQ2C2aDK7A=="
     },
     "node_modules/@primer/view-components": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/@primer/view-components/-/view-components-0.1.4.tgz",
-      "integrity": "sha512-Z5rqs84o7Qox0pEMe5LJW5C/Pgn/YMV7cRjaWJxwvPrlMGtBIk1ds7IcgymcEH2DY/6Jvsm4WQIEwA2AIiHVlg==",
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/@primer/view-components/-/view-components-0.5.1.tgz",
+      "integrity": "sha512-TI51R4rVobwK6sWRhu7HRHC6yxud2I9P1sYN6o/fHhIq7QU31mJyv1PtD8nfhmOqN/SsRC6q3pnCbh5Qt1wD/g==",
       "dependencies": {
         "@github/auto-check-element": "^5.2.0",
         "@github/auto-complete-element": "^3.3.4",
@@ -1953,17 +1920,17 @@
         "@github/clipboard-copy-element": "^1.1.2",
         "@github/details-menu-element": "^1.0.12",
         "@github/image-crop-element": "^5.0.0",
-        "@github/mini-throttle": "^2.1.0",
+        "@github/include-fragment-element": "^6.1.1",
         "@github/relative-time-element": "^4.0.0",
         "@github/tab-container-element": "^3.1.2",
-        "@oddbird/popover-polyfill": "^0.0.10",
-        "@primer/behaviors": "^1.2.0"
+        "@oddbird/popover-polyfill": "^0.2.1",
+        "@primer/behaviors": "^1.3.4"
       }
     },
     "node_modules/@puppeteer/browsers": {
-      "version": "1.4.6",
-      "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz",
-      "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==",
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.7.0.tgz",
+      "integrity": "sha512-sl7zI0IkbQGak/+IE3VEEZab5SSOlI5F6558WvzWGC1n3+C722rfewC1ZIkcF9dsoGSsxhsONoseVlNQG4wWvQ==",
       "dependencies": {
         "debug": "4.3.4",
         "extract-zip": "2.0.1",
@@ -1978,14 +1945,6 @@
       },
       "engines": {
         "node": ">=16.3.0"
-      },
-      "peerDependencies": {
-        "typescript": ">= 4.7.4"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
       }
     },
     "node_modules/@puppeteer/browsers/node_modules/tar-fs": {
@@ -2143,12 +2102,6 @@
       "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==",
       "devOptional": true
     },
-    "node_modules/@types/prettier": {
-      "version": "2.7.3",
-      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
-      "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
-      "dev": true
-    },
     "node_modules/@types/stack-utils": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz",
@@ -2402,15 +2355,15 @@
       "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw=="
     },
     "node_modules/babel-jest": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.1.tgz",
-      "integrity": "sha512-qu+3bdPEQC6KZSPz+4Fyjbga5OODNcp49j6GKzG1EKbkfyJBxEYGVUmVGpwCSeGouG52R4EgYMLb6p9YeEEQ4A==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.3.tgz",
+      "integrity": "sha512-1Ne93zZZEy5XmTa4Q+W5+zxBrDpExX8E3iy+xJJ+24ewlfo/T3qHfQJCzi/MMVFmBQDNxtRR/Gfd2dwb/0yrQw==",
       "dev": true,
       "dependencies": {
-        "@jest/transform": "^29.6.1",
+        "@jest/transform": "^29.6.3",
         "@types/babel__core": "^7.1.14",
         "babel-plugin-istanbul": "^6.1.1",
-        "babel-preset-jest": "^29.5.0",
+        "babel-preset-jest": "^29.6.3",
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
         "slash": "^3.0.0"
@@ -2438,10 +2391,35 @@
         "node": ">=8"
       }
     },
+    "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+      "dev": true,
+      "dependencies": {
+        "@babel/core": "^7.12.3",
+        "@babel/parser": "^7.14.7",
+        "@istanbuljs/schema": "^0.1.2",
+        "istanbul-lib-coverage": "^3.2.0",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/babel-plugin-istanbul/node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "dev": true,
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
     "node_modules/babel-plugin-jest-hoist": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz",
-      "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+      "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
       "dev": true,
       "dependencies": {
         "@babel/template": "^7.3.3",
@@ -2477,12 +2455,12 @@
       }
     },
     "node_modules/babel-preset-jest": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz",
-      "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+      "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
       "dev": true,
       "dependencies": {
-        "babel-plugin-jest-hoist": "^29.5.0",
+        "babel-plugin-jest-hoist": "^29.6.3",
         "babel-preset-current-node-syntax": "^1.0.0"
       },
       "engines": {
@@ -2637,9 +2615,9 @@
       }
     },
     "node_modules/browserslist": {
-      "version": "4.21.9",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz",
-      "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
+      "version": "4.21.10",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz",
+      "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==",
       "dev": true,
       "funding": [
         {
@@ -2656,9 +2634,9 @@
         }
       ],
       "dependencies": {
-        "caniuse-lite": "^1.0.30001503",
-        "electron-to-chromium": "^1.4.431",
-        "node-releases": "^2.0.12",
+        "caniuse-lite": "^1.0.30001517",
+        "electron-to-chromium": "^1.4.477",
+        "node-releases": "^2.0.13",
         "update-browserslist-db": "^1.0.11"
       },
       "bin": {
@@ -2763,9 +2741,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001517",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001517.tgz",
-      "integrity": "sha512-Vdhm5S11DaFVLlyiKu4hiUTkpZu+y1KA/rZZqVQfOD5YdDT/eQKlkt7NaE0WGOFgX32diqt9MiP9CAiFeRklaA==",
+      "version": "1.0.30001522",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz",
+      "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==",
       "dev": true,
       "funding": [
         {
@@ -2878,11 +2856,11 @@
       }
     },
     "node_modules/chromium-bidi": {
-      "version": "0.4.16",
-      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz",
-      "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==",
+      "version": "0.4.20",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.20.tgz",
+      "integrity": "sha512-ruHgVZFEv00mAQMz1tQjfjdG63jiPWrQPF6HLlX2ucqLqVTJoWngeBEKHaJ6n1swV/HSvgnBNbtTRIlcVyW3Fw==",
       "dependencies": {
-        "mitt": "3.0.0"
+        "mitt": "3.0.1"
       },
       "peerDependencies": {
         "devtools-protocol": "*"
@@ -3743,10 +3721,18 @@
       }
     },
     "node_modules/dedent": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
-      "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
-      "dev": true
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz",
+      "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==",
+      "dev": true,
+      "peerDependencies": {
+        "babel-plugin-macros": "^3.1.0"
+      },
+      "peerDependenciesMeta": {
+        "babel-plugin-macros": {
+          "optional": true
+        }
+      }
     },
     "node_modules/deep-extend": {
       "version": "0.6.0",
@@ -3850,14 +3836,14 @@
       }
     },
     "node_modules/devtools-protocol": {
-      "version": "0.0.1147663",
-      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz",
-      "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ=="
+      "version": "0.0.1159816",
+      "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1159816.tgz",
+      "integrity": "sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA=="
     },
     "node_modules/diff-sequences": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
-      "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+      "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
       "dev": true,
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -3971,9 +3957,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.468",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.468.tgz",
-      "integrity": "sha512-6M1qyhaJOt7rQtNti1lBA0GwclPH+oKCmsra/hkcWs5INLxfXXD/dtdnaKUYQu/pjOBP/8Osoe4mAcNvvzoFag==",
+      "version": "1.4.500",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz",
+      "integrity": "sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==",
       "dev": true
     },
     "node_modules/emittery": {
@@ -4088,27 +4074,27 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.45.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
-      "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
+      "version": "8.47.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz",
+      "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
-        "@eslint-community/regexpp": "^4.4.0",
-        "@eslint/eslintrc": "^2.1.0",
-        "@eslint/js": "8.44.0",
+        "@eslint-community/regexpp": "^4.6.1",
+        "@eslint/eslintrc": "^2.1.2",
+        "@eslint/js": "^8.47.0",
         "@humanwhocodes/config-array": "^0.11.10",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
-        "ajv": "^6.10.0",
+        "ajv": "^6.12.4",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
         "debug": "^4.3.2",
         "doctrine": "^3.0.0",
         "escape-string-regexp": "^4.0.0",
-        "eslint-scope": "^7.2.0",
-        "eslint-visitor-keys": "^3.4.1",
-        "espree": "^9.6.0",
+        "eslint-scope": "^7.2.2",
+        "eslint-visitor-keys": "^3.4.3",
+        "espree": "^9.6.1",
         "esquery": "^1.4.2",
         "esutils": "^2.0.2",
         "fast-deep-equal": "^3.1.3",
@@ -4142,9 +4128,9 @@
       }
     },
     "node_modules/eslint-scope": {
-      "version": "7.2.1",
-      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz",
-      "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==",
+      "version": "7.2.2",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+      "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
       "dev": true,
       "dependencies": {
         "esrecurse": "^4.3.0",
@@ -4158,9 +4144,9 @@
       }
     },
     "node_modules/eslint-visitor-keys": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
-      "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+      "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -4309,17 +4295,16 @@
       }
     },
     "node_modules/expect": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz",
-      "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.3.tgz",
+      "integrity": "sha512-x1vY4LlEMWUYVZQrFi4ZANXFwqYbJ/JNQspLVvzhW2BNY28aNcXMQH6imBbt+RBf5sVRTodYHXtSP/TLEU0Dxw==",
       "dev": true,
       "dependencies": {
-        "@jest/expect-utils": "^29.6.1",
-        "@types/node": "*",
-        "jest-get-type": "^29.4.3",
-        "jest-matcher-utils": "^29.6.1",
-        "jest-message-util": "^29.6.1",
-        "jest-util": "^29.6.1"
+        "@jest/expect-utils": "^29.6.3",
+        "jest-get-type": "^29.6.3",
+        "jest-matcher-utils": "^29.6.3",
+        "jest-message-util": "^29.6.3",
+        "jest-util": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -4367,9 +4352,9 @@
       }
     },
     "node_modules/express-rate-limit": {
-      "version": "6.8.0",
-      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.8.0.tgz",
-      "integrity": "sha512-yVeDWczkh8qgo9INJB1tT4j7LFu+n6ei/oqSMsqpsUIGYjTM+gk+Q3wv19TMUdo8chvus8XohAuOhG7RYRM9ZQ==",
+      "version": "6.9.0",
+      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.9.0.tgz",
+      "integrity": "sha512-AnISR3V8qy4gpKM62/TzYdoFO9NV84fBx0POXzTryHU/qGUJBWuVGd+JhbvtVmKBv37t8/afmqdnv16xWoQxag==",
       "engines": {
         "node": ">= 14.0.0"
       },
@@ -4773,9 +4758,9 @@
       "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
     },
     "node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "dev": true,
       "hasInstallScript": true,
       "optional": true,
@@ -4953,9 +4938,9 @@
       }
     },
     "node_modules/globals": {
-      "version": "13.20.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
-      "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
+      "version": "13.21.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
+      "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
       "dev": true,
       "dependencies": {
         "type-fest": "^0.20.2"
@@ -5242,9 +5227,9 @@
       "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
     },
     "node_modules/is-core-module": {
-      "version": "2.12.1",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz",
-      "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==",
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
+      "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
       "dev": true,
       "dependencies": {
         "has": "^1.0.3"
@@ -5361,42 +5346,48 @@
       }
     },
     "node_modules/istanbul-lib-instrument": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
-      "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz",
+      "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.12.3",
         "@babel/parser": "^7.14.7",
         "@istanbuljs/schema": "^0.1.2",
         "istanbul-lib-coverage": "^3.2.0",
-        "semver": "^6.3.0"
+        "semver": "^7.5.4"
       },
       "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/istanbul-lib-instrument/node_modules/semver": {
-      "version": "6.3.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
-      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
-      "dev": true,
-      "bin": {
-        "semver": "bin/semver.js"
+        "node": ">=10"
       }
     },
     "node_modules/istanbul-lib-report": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz",
-      "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+      "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
       "dev": true,
       "dependencies": {
         "istanbul-lib-coverage": "^3.0.0",
-        "make-dir": "^3.0.0",
+        "make-dir": "^4.0.0",
         "supports-color": "^7.1.0"
       },
       "engines": {
-        "node": ">=8"
+        "node": ">=10"
+      }
+    },
+    "node_modules/istanbul-lib-report/node_modules/make-dir": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+      "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+      "dev": true,
+      "dependencies": {
+        "semver": "^7.5.3"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
       }
     },
     "node_modules/istanbul-lib-source-maps": {
@@ -5414,9 +5405,9 @@
       }
     },
     "node_modules/istanbul-reports": {
-      "version": "3.1.5",
-      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz",
-      "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==",
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
+      "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==",
       "dev": true,
       "dependencies": {
         "html-escaper": "^2.0.0",
@@ -5469,15 +5460,15 @@
       }
     },
     "node_modules/jest": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.1.tgz",
-      "integrity": "sha512-Nirw5B4nn69rVUZtemCQhwxOBhm0nsp3hmtF4rzCeWD7BkjAXRIji7xWQfnTNbz9g0aVsBX6aZK3n+23LM6uDw==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.3.tgz",
+      "integrity": "sha512-alueLuoPCDNHFcFGmgETR4KpQ+0ff3qVaiJwxQM4B5sC0CvXcgg4PEi7xrDkxuItDmdz/FVc7SSit4KEu8GRvw==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.6.1",
-        "@jest/types": "^29.6.1",
+        "@jest/core": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "import-local": "^3.0.2",
-        "jest-cli": "^29.6.1"
+        "jest-cli": "^29.6.3"
       },
       "bin": {
         "jest": "bin/jest.js"
@@ -5495,12 +5486,13 @@
       }
     },
     "node_modules/jest-changed-files": {
-      "version": "29.5.0",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz",
-      "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz",
+      "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==",
       "dev": true,
       "dependencies": {
         "execa": "^5.0.0",
+        "jest-util": "^29.6.3",
         "p-limit": "^3.1.0"
       },
       "engines": {
@@ -5508,28 +5500,28 @@
       }
     },
     "node_modules/jest-circus": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.1.tgz",
-      "integrity": "sha512-tPbYLEiBU4MYAL2XoZme/bgfUeotpDBd81lgHLCbDZZFaGmECk0b+/xejPFtmiBP87GgP/y4jplcRpbH+fgCzQ==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.3.tgz",
+      "integrity": "sha512-p0R5YqZEMnOpHqHLWRSjm2z/0p6RNsrNE/GRRT3eli8QGOAozj6Ys/3Tv+Ej+IfltJoSPwcQ6/hOCRkNlxLLCw==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.1",
-        "@jest/expect": "^29.6.1",
-        "@jest/test-result": "^29.6.1",
-        "@jest/types": "^29.6.1",
+        "@jest/environment": "^29.6.3",
+        "@jest/expect": "^29.6.3",
+        "@jest/test-result": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "co": "^4.6.0",
-        "dedent": "^0.7.0",
+        "dedent": "^1.0.0",
         "is-generator-fn": "^2.0.0",
-        "jest-each": "^29.6.1",
-        "jest-matcher-utils": "^29.6.1",
-        "jest-message-util": "^29.6.1",
-        "jest-runtime": "^29.6.1",
-        "jest-snapshot": "^29.6.1",
-        "jest-util": "^29.6.1",
+        "jest-each": "^29.6.3",
+        "jest-matcher-utils": "^29.6.3",
+        "jest-message-util": "^29.6.3",
+        "jest-runtime": "^29.6.3",
+        "jest-snapshot": "^29.6.3",
+        "jest-util": "^29.6.3",
         "p-limit": "^3.1.0",
-        "pretty-format": "^29.6.1",
+        "pretty-format": "^29.6.3",
         "pure-rand": "^6.0.0",
         "slash": "^3.0.0",
         "stack-utils": "^2.0.3"
@@ -5539,21 +5531,21 @@
       }
     },
     "node_modules/jest-cli": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.1.tgz",
-      "integrity": "sha512-607dSgTA4ODIN6go9w6xY3EYkyPFGicx51a69H7yfvt7lN53xNswEVLovq+E77VsTRi5fWprLH0yl4DJgE8Ing==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.3.tgz",
+      "integrity": "sha512-KuPdXUPXQIf0t6DvmG8MV4QyhcjR1a6ruKl3YL7aGn/AQ8JkROwFkWzEpDIpt11Qy188dHbRm8WjwMsV/4nmnQ==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.6.1",
-        "@jest/test-result": "^29.6.1",
-        "@jest/types": "^29.6.1",
+        "@jest/core": "^29.6.3",
+        "@jest/test-result": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "chalk": "^4.0.0",
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
         "import-local": "^3.0.2",
-        "jest-config": "^29.6.1",
-        "jest-util": "^29.6.1",
-        "jest-validate": "^29.6.1",
+        "jest-config": "^29.6.3",
+        "jest-util": "^29.6.3",
+        "jest-validate": "^29.6.3",
         "prompts": "^2.0.1",
         "yargs": "^17.3.1"
       },
@@ -5573,31 +5565,31 @@
       }
     },
     "node_modules/jest-config": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.1.tgz",
-      "integrity": "sha512-XdjYV2fy2xYixUiV2Wc54t3Z4oxYPAELUzWnV6+mcbq0rh742X2p52pii5A3oeRzYjLnQxCsZmp0qpI6klE2cQ==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.3.tgz",
+      "integrity": "sha512-nb9bOq2aEqogbyL4F9mLkAeQGAgNt7Uz6U59YtQDIxFPiL7Ejgq0YIrp78oyEHD6H4CIV/k7mFrK7eFDzUJ69w==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
-        "@jest/test-sequencer": "^29.6.1",
-        "@jest/types": "^29.6.1",
-        "babel-jest": "^29.6.1",
+        "@jest/test-sequencer": "^29.6.3",
+        "@jest/types": "^29.6.3",
+        "babel-jest": "^29.6.3",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
         "deepmerge": "^4.2.2",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-circus": "^29.6.1",
-        "jest-environment-node": "^29.6.1",
-        "jest-get-type": "^29.4.3",
-        "jest-regex-util": "^29.4.3",
-        "jest-resolve": "^29.6.1",
-        "jest-runner": "^29.6.1",
-        "jest-util": "^29.6.1",
-        "jest-validate": "^29.6.1",
+        "jest-circus": "^29.6.3",
+        "jest-environment-node": "^29.6.3",
+        "jest-get-type": "^29.6.3",
+        "jest-regex-util": "^29.6.3",
+        "jest-resolve": "^29.6.3",
+        "jest-runner": "^29.6.3",
+        "jest-util": "^29.6.3",
+        "jest-validate": "^29.6.3",
         "micromatch": "^4.0.4",
         "parse-json": "^5.2.0",
-        "pretty-format": "^29.6.1",
+        "pretty-format": "^29.6.3",
         "slash": "^3.0.0",
         "strip-json-comments": "^3.1.1"
       },
@@ -5618,24 +5610,24 @@
       }
     },
     "node_modules/jest-diff": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz",
-      "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.3.tgz",
+      "integrity": "sha512-3sw+AdWnwH9sSNohMRKA7JiYUJSRr/WS6+sEFfBuhxU5V5GlEVKfvUn8JuMHE0wqKowemR1C2aHy8VtXbaV8dQ==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
-        "diff-sequences": "^29.4.3",
-        "jest-get-type": "^29.4.3",
-        "pretty-format": "^29.6.1"
+        "diff-sequences": "^29.6.3",
+        "jest-get-type": "^29.6.3",
+        "pretty-format": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-docblock": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz",
-      "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz",
+      "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==",
       "dev": true,
       "dependencies": {
         "detect-newline": "^3.0.0"
@@ -5645,62 +5637,62 @@
       }
     },
     "node_modules/jest-each": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.1.tgz",
-      "integrity": "sha512-n5eoj5eiTHpKQCAVcNTT7DRqeUmJ01hsAL0Q1SMiBHcBcvTKDELixQOGMCpqhbIuTcfC4kMfSnpmDqRgRJcLNQ==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz",
+      "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.6.1",
+        "@jest/types": "^29.6.3",
         "chalk": "^4.0.0",
-        "jest-get-type": "^29.4.3",
-        "jest-util": "^29.6.1",
-        "pretty-format": "^29.6.1"
+        "jest-get-type": "^29.6.3",
+        "jest-util": "^29.6.3",
+        "pretty-format": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-environment-node": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.1.tgz",
-      "integrity": "sha512-ZNIfAiE+foBog24W+2caIldl4Irh8Lx1PUhg/GZ0odM1d/h2qORAsejiFc7zb+SEmYPn1yDZzEDSU5PmDkmVLQ==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.3.tgz",
+      "integrity": "sha512-PKl7upfPJXMYbWpD+60o4HP86KvFO2c9dZ+Zr6wUzsG5xcPx/65o3ArNgHW5M0RFvLYdW4/aieR4JSooD0a2ew==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.1",
-        "@jest/fake-timers": "^29.6.1",
-        "@jest/types": "^29.6.1",
+        "@jest/environment": "^29.6.3",
+        "@jest/fake-timers": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
-        "jest-mock": "^29.6.1",
-        "jest-util": "^29.6.1"
+        "jest-mock": "^29.6.3",
+        "jest-util": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-get-type": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
-      "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+      "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
       "dev": true,
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-haste-map": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.1.tgz",
-      "integrity": "sha512-0m7f9PZXxOCk1gRACiVgX85knUKPKLPg4oRCjLoqIm9brTHXaorMA0JpmtmVkQiT8nmXyIVoZd/nnH1cfC33ig==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.3.tgz",
+      "integrity": "sha512-GecR5YavfjkhOytEFHAeI6aWWG3f/cOKNB1YJvj/B76xAmeVjy4zJUYobGF030cRmKaO1FBw3V8CZZ6KVh9ZSw==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.6.1",
+        "@jest/types": "^29.6.3",
         "@types/graceful-fs": "^4.1.3",
         "@types/node": "*",
         "anymatch": "^3.0.3",
         "fb-watchman": "^2.0.0",
         "graceful-fs": "^4.2.9",
-        "jest-regex-util": "^29.4.3",
-        "jest-util": "^29.6.1",
-        "jest-worker": "^29.6.1",
+        "jest-regex-util": "^29.6.3",
+        "jest-util": "^29.6.3",
+        "jest-worker": "^29.6.3",
         "micromatch": "^4.0.4",
         "walker": "^1.0.8"
       },
@@ -5712,46 +5704,46 @@
       }
     },
     "node_modules/jest-leak-detector": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.1.tgz",
-      "integrity": "sha512-OrxMNyZirpOEwkF3UHnIkAiZbtkBWiye+hhBweCHkVbCgyEy71Mwbb5zgeTNYWJBi1qgDVfPC1IwO9dVEeTLwQ==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz",
+      "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==",
       "dev": true,
       "dependencies": {
-        "jest-get-type": "^29.4.3",
-        "pretty-format": "^29.6.1"
+        "jest-get-type": "^29.6.3",
+        "pretty-format": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-matcher-utils": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz",
-      "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.3.tgz",
+      "integrity": "sha512-6ZrMYINZdwduSt5Xu18/n49O1IgXdjsfG7NEZaQws9k69eTKWKcVbJBw/MZsjOZe2sSyJFmuzh8042XWwl54Zg==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
-        "jest-diff": "^29.6.1",
-        "jest-get-type": "^29.4.3",
-        "pretty-format": "^29.6.1"
+        "jest-diff": "^29.6.3",
+        "jest-get-type": "^29.6.3",
+        "pretty-format": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-message-util": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz",
-      "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz",
+      "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==",
       "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.12.13",
-        "@jest/types": "^29.6.1",
+        "@jest/types": "^29.6.3",
         "@types/stack-utils": "^2.0.0",
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
         "micromatch": "^4.0.4",
-        "pretty-format": "^29.6.1",
+        "pretty-format": "^29.6.3",
         "slash": "^3.0.0",
         "stack-utils": "^2.0.3"
       },
@@ -5760,14 +5752,14 @@
       }
     },
     "node_modules/jest-mock": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.1.tgz",
-      "integrity": "sha512-brovyV9HBkjXAEdRooaTQK42n8usKoSRR3gihzUpYeV/vwqgSoNfrksO7UfSACnPmxasO/8TmHM3w9Hp3G1dgw==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz",
+      "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.6.1",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
-        "jest-util": "^29.6.1"
+        "jest-util": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -5791,26 +5783,26 @@
       }
     },
     "node_modules/jest-regex-util": {
-      "version": "29.4.3",
-      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz",
-      "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+      "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
       "dev": true,
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-resolve": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.1.tgz",
-      "integrity": "sha512-AeRkyS8g37UyJiP9w3mmI/VXU/q8l/IH52vj/cDAyScDcemRbSBhfX/NMYIGilQgSVwsjxrCHf3XJu4f+lxCMg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.3.tgz",
+      "integrity": "sha512-WMXwxhvzDeA/J+9jz1i8ZKGmbw/n+s988EiUvRI4egM+eTn31Hb5v10Re3slG3/qxntkBt2/6GkQVDGu6Bwyhw==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.1",
+        "jest-haste-map": "^29.6.3",
         "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^29.6.1",
-        "jest-validate": "^29.6.1",
+        "jest-util": "^29.6.3",
+        "jest-validate": "^29.6.3",
         "resolve": "^1.20.0",
         "resolve.exports": "^2.0.0",
         "slash": "^3.0.0"
@@ -5820,43 +5812,43 @@
       }
     },
     "node_modules/jest-resolve-dependencies": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.1.tgz",
-      "integrity": "sha512-BbFvxLXtcldaFOhNMXmHRWx1nXQO5LoXiKSGQcA1LxxirYceZT6ch8KTE1bK3X31TNG/JbkI7OkS/ABexVahiw==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.3.tgz",
+      "integrity": "sha512-iah5nhSPTwtUV7yzpTc9xGg8gP3Ch2VNsuFMsKoCkNCrQSbFtx5KRPemmPJ32AUhTSDqJXB6djPN6zAaUGV53g==",
       "dev": true,
       "dependencies": {
-        "jest-regex-util": "^29.4.3",
-        "jest-snapshot": "^29.6.1"
+        "jest-regex-util": "^29.6.3",
+        "jest-snapshot": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-runner": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.1.tgz",
-      "integrity": "sha512-tw0wb2Q9yhjAQ2w8rHRDxteryyIck7gIzQE4Reu3JuOBpGp96xWgF0nY8MDdejzrLCZKDcp8JlZrBN/EtkQvPQ==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.3.tgz",
+      "integrity": "sha512-E4zsMhQnjhirFPhDTJgoLMWUrVCDij/KGzWlbslDHGuO8Hl2pVUfOiygMzVZtZq+BzmlqwEr7LYmW+WFLlmX8w==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.6.1",
-        "@jest/environment": "^29.6.1",
-        "@jest/test-result": "^29.6.1",
-        "@jest/transform": "^29.6.1",
-        "@jest/types": "^29.6.1",
+        "@jest/console": "^29.6.3",
+        "@jest/environment": "^29.6.3",
+        "@jest/test-result": "^29.6.3",
+        "@jest/transform": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
         "graceful-fs": "^4.2.9",
-        "jest-docblock": "^29.4.3",
-        "jest-environment-node": "^29.6.1",
-        "jest-haste-map": "^29.6.1",
-        "jest-leak-detector": "^29.6.1",
-        "jest-message-util": "^29.6.1",
-        "jest-resolve": "^29.6.1",
-        "jest-runtime": "^29.6.1",
-        "jest-util": "^29.6.1",
-        "jest-watcher": "^29.6.1",
-        "jest-worker": "^29.6.1",
+        "jest-docblock": "^29.6.3",
+        "jest-environment-node": "^29.6.3",
+        "jest-haste-map": "^29.6.3",
+        "jest-leak-detector": "^29.6.3",
+        "jest-message-util": "^29.6.3",
+        "jest-resolve": "^29.6.3",
+        "jest-runtime": "^29.6.3",
+        "jest-util": "^29.6.3",
+        "jest-watcher": "^29.6.3",
+        "jest-worker": "^29.6.3",
         "p-limit": "^3.1.0",
         "source-map-support": "0.5.13"
       },
@@ -5865,31 +5857,31 @@
       }
     },
     "node_modules/jest-runtime": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.1.tgz",
-      "integrity": "sha512-D6/AYOA+Lhs5e5il8+5pSLemjtJezUr+8zx+Sn8xlmOux3XOqx4d8l/2udBea8CRPqqrzhsKUsN/gBDE/IcaPQ==",
-      "dev": true,
-      "dependencies": {
-        "@jest/environment": "^29.6.1",
-        "@jest/fake-timers": "^29.6.1",
-        "@jest/globals": "^29.6.1",
-        "@jest/source-map": "^29.6.0",
-        "@jest/test-result": "^29.6.1",
-        "@jest/transform": "^29.6.1",
-        "@jest/types": "^29.6.1",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.3.tgz",
+      "integrity": "sha512-VM0Z3a9xaqizGpEKwCOIhImkrINYzxgwk8oQAvrmAiXX8LNrJrRjyva30RkuRY0ETAotHLlUcd2moviCA1hgsQ==",
+      "dev": true,
+      "dependencies": {
+        "@jest/environment": "^29.6.3",
+        "@jest/fake-timers": "^29.6.3",
+        "@jest/globals": "^29.6.3",
+        "@jest/source-map": "^29.6.3",
+        "@jest/test-result": "^29.6.3",
+        "@jest/transform": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "cjs-module-lexer": "^1.0.0",
         "collect-v8-coverage": "^1.0.0",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.1",
-        "jest-message-util": "^29.6.1",
-        "jest-mock": "^29.6.1",
-        "jest-regex-util": "^29.4.3",
-        "jest-resolve": "^29.6.1",
-        "jest-snapshot": "^29.6.1",
-        "jest-util": "^29.6.1",
+        "jest-haste-map": "^29.6.3",
+        "jest-message-util": "^29.6.3",
+        "jest-mock": "^29.6.3",
+        "jest-regex-util": "^29.6.3",
+        "jest-resolve": "^29.6.3",
+        "jest-snapshot": "^29.6.3",
+        "jest-util": "^29.6.3",
         "slash": "^3.0.0",
         "strip-bom": "^4.0.0"
       },
@@ -5898,9 +5890,9 @@
       }
     },
     "node_modules/jest-snapshot": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.1.tgz",
-      "integrity": "sha512-G4UQE1QQ6OaCgfY+A0uR1W2AY0tGXUPQpoUClhWHq1Xdnx1H6JOrC2nH5lqnOEqaDgbHFgIwZ7bNq24HpB180A==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.3.tgz",
+      "integrity": "sha512-66Iu7H1ojiveQMGFnKecHIZPPPBjZwfQEnF6wxqpxGf57sV3YSUtAb5/sTKM5TPa3OndyxZp1wxHFbmgVhc53w==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
@@ -5908,21 +5900,20 @@
         "@babel/plugin-syntax-jsx": "^7.7.2",
         "@babel/plugin-syntax-typescript": "^7.7.2",
         "@babel/types": "^7.3.3",
-        "@jest/expect-utils": "^29.6.1",
-        "@jest/transform": "^29.6.1",
-        "@jest/types": "^29.6.1",
-        "@types/prettier": "^2.1.5",
+        "@jest/expect-utils": "^29.6.3",
+        "@jest/transform": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "babel-preset-current-node-syntax": "^1.0.0",
         "chalk": "^4.0.0",
-        "expect": "^29.6.1",
+        "expect": "^29.6.3",
         "graceful-fs": "^4.2.9",
-        "jest-diff": "^29.6.1",
-        "jest-get-type": "^29.4.3",
-        "jest-matcher-utils": "^29.6.1",
-        "jest-message-util": "^29.6.1",
-        "jest-util": "^29.6.1",
+        "jest-diff": "^29.6.3",
+        "jest-get-type": "^29.6.3",
+        "jest-matcher-utils": "^29.6.3",
+        "jest-message-util": "^29.6.3",
+        "jest-util": "^29.6.3",
         "natural-compare": "^1.4.0",
-        "pretty-format": "^29.6.1",
+        "pretty-format": "^29.6.3",
         "semver": "^7.5.3"
       },
       "engines": {
@@ -5930,12 +5921,12 @@
       }
     },
     "node_modules/jest-util": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz",
-      "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz",
+      "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.6.1",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
@@ -5947,17 +5938,17 @@
       }
     },
     "node_modules/jest-validate": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.1.tgz",
-      "integrity": "sha512-r3Ds69/0KCN4vx4sYAbGL1EVpZ7MSS0vLmd3gV78O+NAx3PDQQukRU5hNHPXlyqCgFY8XUk7EuTMLugh0KzahA==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz",
+      "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==",
       "dev": true,
       "dependencies": {
-        "@jest/types": "^29.6.1",
+        "@jest/types": "^29.6.3",
         "camelcase": "^6.2.0",
         "chalk": "^4.0.0",
-        "jest-get-type": "^29.4.3",
+        "jest-get-type": "^29.6.3",
         "leven": "^3.1.0",
-        "pretty-format": "^29.6.1"
+        "pretty-format": "^29.6.3"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -5976,18 +5967,18 @@
       }
     },
     "node_modules/jest-watcher": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.1.tgz",
-      "integrity": "sha512-d4wpjWTS7HEZPaaj8m36QiaP856JthRZkrgcIY/7ISoUWPIillrXM23WPboZVLbiwZBt4/qn2Jke84Sla6JhFA==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.3.tgz",
+      "integrity": "sha512-NgpFjZ2U2MKusjidbi4Oiu7tfs+nrgdIxIEVROvH1cFmOei9Uj25lwkMsakqLnH/s0nEcvxO1ck77FiRlcnpZg==",
       "dev": true,
       "dependencies": {
-        "@jest/test-result": "^29.6.1",
-        "@jest/types": "^29.6.1",
+        "@jest/test-result": "^29.6.3",
+        "@jest/types": "^29.6.3",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
-        "jest-util": "^29.6.1",
+        "jest-util": "^29.6.3",
         "string-length": "^4.0.1"
       },
       "engines": {
@@ -5995,13 +5986,13 @@
       }
     },
     "node_modules/jest-worker": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz",
-      "integrity": "sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.3.tgz",
+      "integrity": "sha512-wacANXecZ/GbQakpf2CClrqrlwsYYDSXFd4fIGdL+dXpM2GWoJ+6bhQ7vR3TKi3+gkSfBkjy1/khH/WrYS4Q6g==",
       "dev": true,
       "dependencies": {
         "@types/node": "*",
-        "jest-util": "^29.6.1",
+        "jest-util": "^29.6.3",
         "merge-stream": "^2.0.0",
         "supports-color": "^8.0.0"
       },
@@ -6245,7 +6236,7 @@
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
       "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
-      "devOptional": true,
+      "optional": true,
       "dependencies": {
         "semver": "^6.0.0"
       },
@@ -6260,7 +6251,7 @@
       "version": "6.3.0",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
       "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-      "devOptional": true,
+      "optional": true,
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -6283,14 +6274,14 @@
       }
     },
     "node_modules/marked": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-5.1.1.tgz",
-      "integrity": "sha512-bTmmGdEINWmOMDjnPWDxGPQ4qkDLeYorpYbEtFOXzOruTwUE671q4Guiuchn4N8h/v6NGd7916kXsm3Iz4iUSg==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-7.0.4.tgz",
+      "integrity": "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==",
       "bin": {
         "marked": "bin/marked.js"
       },
       "engines": {
-        "node": ">= 18"
+        "node": ">= 16"
       }
     },
     "node_modules/mdn-data": {
@@ -6445,9 +6436,9 @@
       "optional": true
     },
     "node_modules/mitt": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
-      "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ=="
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+      "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
     },
     "node_modules/mkdirp": {
       "version": "1.0.4",
@@ -6561,9 +6552,9 @@
       }
     },
     "node_modules/node-fetch": {
-      "version": "3.3.1",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz",
-      "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==",
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
+      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
       "dependencies": {
         "data-uri-to-buffer": "^4.0.0",
         "fetch-blob": "^3.1.4",
@@ -7163,12 +7154,12 @@
       }
     },
     "node_modules/pretty-format": {
-      "version": "29.6.1",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz",
-      "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==",
+      "version": "29.6.3",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz",
+      "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==",
       "dev": true,
       "dependencies": {
-        "@jest/schemas": "^29.6.0",
+        "@jest/schemas": "^29.6.3",
         "ansi-styles": "^5.0.0",
         "react-is": "^18.0.0"
       },
@@ -7318,41 +7309,33 @@
       }
     },
     "node_modules/puppeteer": {
-      "version": "20.9.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-20.9.0.tgz",
-      "integrity": "sha512-kAglT4VZ9fWEGg3oLc4/de+JcONuEJhlh3J6f5R1TLkrY/EHHIHxWXDOzXvaxQCtedmyVXBwg8M+P8YCO/wZjw==",
+      "version": "21.1.0",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.1.0.tgz",
+      "integrity": "sha512-x0KfxVd7Hsefq8nzH1AAdSnYw5HEKI4QPeexBmx7nO29jDoEKNE+75G8zQ0E57ZOny/vAZZptCFdD3A7PkeESQ==",
       "hasInstallScript": true,
       "dependencies": {
-        "@puppeteer/browsers": "1.4.6",
+        "@puppeteer/browsers": "1.7.0",
         "cosmiconfig": "8.2.0",
-        "puppeteer-core": "20.9.0"
+        "puppeteer-core": "21.1.0"
       },
       "engines": {
         "node": ">=16.3.0"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "20.9.0",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz",
-      "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==",
+      "version": "21.1.0",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.1.0.tgz",
+      "integrity": "sha512-ggfTj09jo81Y6M4DyNj80GrY6Pip+AtDUgGljqoSzP6FG5nz5Aju6Cs/X147fLgkJ4UKTb736U6cDp0ssLzN5Q==",
       "dependencies": {
-        "@puppeteer/browsers": "1.4.6",
-        "chromium-bidi": "0.4.16",
+        "@puppeteer/browsers": "1.7.0",
+        "chromium-bidi": "0.4.20",
         "cross-fetch": "4.0.0",
         "debug": "4.3.4",
-        "devtools-protocol": "0.0.1147663",
+        "devtools-protocol": "0.0.1159816",
         "ws": "8.13.0"
       },
       "engines": {
         "node": ">=16.3.0"
-      },
-      "peerDependencies": {
-        "typescript": ">= 4.7.4"
-      },
-      "peerDependenciesMeta": {
-        "typescript": {
-          "optional": true
-        }
       }
     },
     "node_modules/puppeteer-core/node_modules/cross-fetch": {
@@ -7364,9 +7347,9 @@
       }
     },
     "node_modules/puppeteer-core/node_modules/node-fetch": {
-      "version": "2.6.12",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
-      "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
       "dependencies": {
         "whatwg-url": "^5.0.0"
       },
@@ -7641,12 +7624,12 @@
       "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
     },
     "node_modules/resolve": {
-      "version": "1.22.2",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz",
-      "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==",
+      "version": "1.22.4",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz",
+      "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==",
       "dev": true,
       "dependencies": {
-        "is-core-module": "^2.11.0",
+        "is-core-module": "^2.13.0",
         "path-parse": "^1.0.7",
         "supports-preserve-symlinks-flag": "^1.0.0"
       },
@@ -7959,9 +7942,9 @@
       "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
     },
     "node_modules/sharp": {
-      "version": "0.32.4",
-      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.4.tgz",
-      "integrity": "sha512-exUnZewqVZC6UXqXuQ8fyJJv0M968feBi04jb9GcUHrWtkRoAKnbJt8IfwT4NJs7FskArbJ14JAFGVuooszoGg==",
+      "version": "0.32.5",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.5.tgz",
+      "integrity": "sha512-0dap3iysgDkNaPOaOL4X/0akdu0ma62GcdC2NBQ+93eqpePdDdr2/LM0sFdDSMmN7yS+odyZtPsb7tx/cYBKnQ==",
       "hasInstallScript": true,
       "dependencies": {
         "color": "^4.2.3",
@@ -8651,9 +8634,9 @@
       }
     },
     "node_modules/tslib": {
-      "version": "2.6.0",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz",
-      "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA=="
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
     },
     "node_modules/tunnel": {
       "version": "0.0.6",
@@ -9031,9 +9014,9 @@
       "optional": true
     },
     "node_modules/xml-formatter": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-3.4.1.tgz",
-      "integrity": "sha512-C7VwnZpz662mZlKtrdREucsABAIlmdph/nMEUszTMsRAGGPMSNfyNOU4UaPBqxXYVadb9uSpc1Xibbj6XpbGRA==",
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/xml-formatter/-/xml-formatter-3.5.0.tgz",
+      "integrity": "sha512-9ij/f2PLIPv+YDywtdztq7U82kYMDa5yPYwpn0TnXnqJRH6Su8RC/oaw91erHe3aSEbfgBaA1hDzReDFb1SVXw==",
       "dependencies": {
         "xml-parser-xo": "^4.1.0"
       },
diff --git a/package.json b/package.json
index 27a4529b40d..dc9cb294311 100644
--- a/package.json
+++ b/package.json
@@ -32,10 +32,10 @@
     "@actions/core": "^1.10.0",
     "@actions/github": "^5.1.1",
     "@faker-js/faker": "^8.0.2",
-    "@octokit/graphql": "^5.0.5",
-    "@octokit/rest": "^19.0.7",
-    "@primer/css": "^21.0.7",
-    "@primer/octicons": "^19.4.0",
+    "@octokit/graphql": "^7.0.1",
+    "@octokit/rest": "^20.0.1",
+    "@primer/css": "^21.0.8",
+    "@primer/octicons": "^19.6.0",
     "@twemoji/parser": "^14.1.0",
     "axios": "^1.4.0",
     "clipboard": "^2.0.11",
@@ -45,33 +45,33 @@
     "ejs": "^3.1.9",
     "emoji-name-map": "^1.2.9",
     "express": "^4.18.2",
-    "express-rate-limit": "^6.8.0",
+    "express-rate-limit": "^6.9.0",
     "file-type": "^18.5.0",
     "js-yaml": "^4.1.0",
     "jsdom": "^22.1.0",
     "linguist-js": "^2.6.1",
-    "marked": "^5.1.1",
+    "marked": "^7.0.4",
     "memory-cache": "^0.2.0",
     "minimatch": "^9.0.3",
-    "node-fetch": "^3.3.1",
+    "node-fetch": "^3.3.2",
     "open-graph-scraper": "^6.2.2",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^20.9.0",
+    "puppeteer": "^21.1.0",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.13.0",
     "sanitize-html": "^2.11.0",
-    "sharp": "^0.32.4",
+    "sharp": "^0.32.5",
     "simple-git": "^3.19.1",
     "svgo": "^3.0.2",
     "vue": "^2.7.1",
     "vue-prism-component": "^1.2.0",
-    "xml-formatter": "^3.4.1"
+    "xml-formatter": "^3.5.0"
   },
   "devDependencies": {
     "dprint": "^0.35.1",
-    "eslint": "^8.45.0",
-    "jest": "^29.6.1"
+    "eslint": "^8.47.0",
+    "jest": "^29.6.3"
   },
   "jest": {
     "testEnvironment": "node",
@@ -79,7 +79,7 @@
     "transform": {}
   },
   "optionalDependencies": {
-    "@googlemaps/google-maps-services-js": "^3.3.34",
+    "@googlemaps/google-maps-services-js": "^3.3.36",
     "chess.js": "^1.0.0-beta.6",
     "color": "^4.2.3",
     "gifencoder": "^2.0.1",

From 54e28d361f535a2180ea45d89ebc70490d47fb56 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 23 Aug 2023 22:59:05 -0400
Subject: [PATCH 144/196] fix: don't die on missing optional dependency
 gifencoder

---
 source/app/metrics/utils.mjs | 44 ++++++++++++++++++++----------------
 1 file changed, 25 insertions(+), 19 deletions(-)

diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 6a10bd0a5d5..29ae610dee9 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -764,26 +764,32 @@ export async function gif({page, width, height, frames, x = 0, y = 0, repeat = t
   if (fss.existsSync(path))
     await fs.unlink(path)
   //Create encoder
-  const GIFEncoder = (await import("gifencoder")).default
-  const encoder = new GIFEncoder(width, height)
-  encoder.createWriteStream().pipe(fss.createWriteStream(path))
-  encoder.start()
-  encoder.setRepeat(repeat ? 0 : -1)
-  encoder.setDelay(delay)
-  encoder.setQuality(quality)
-  //Register frames
-  for (let i = 0; i < frames; i++) {
-    const buffer = new PNG(await page.screenshot({clip: {width, height, x, y}}))
-    encoder.addFrame(await new Promise(solve => buffer.decode(pixels => solve(pixels))))
-    if (frames % 10 === 0)
-      console.debug(`metrics/puppeteergif > processed ${i}/${frames} frames`)
+  try {
+    const GIFEncoder = (await import("gifencoder")).default
+    const encoder = new GIFEncoder(width, height)
+    encoder.createWriteStream().pipe(fss.createWriteStream(path))
+    encoder.start()
+    encoder.setRepeat(repeat ? 0 : -1)
+    encoder.setDelay(delay)
+    encoder.setQuality(quality)
+    //Register frames
+    for (let i = 0; i < frames; i++) {
+      const buffer = new PNG(await page.screenshot({clip: {width, height, x, y}}))
+      encoder.addFrame(await new Promise(solve => buffer.decode(pixels => solve(pixels))))
+      if (frames % 10 === 0)
+        console.debug(`metrics/puppeteergif > processed ${i}/${frames} frames`)
+    }
+    console.debug(`metrics/puppeteergif > processed ${frames}/${frames} frames`)
+    //Close encoder and convert to base64
+    encoder.finish()
+    const result = await fs.readFile(path, "base64")
+    await fs.unlink(path)
+    return `data:image/gif;base64,${result}`
+  }
+  catch (error) {
+    console.debug(`metrics/puppeteergif > could not create gif: ${error}`)
+    return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg=="
   }
-  console.debug(`metrics/puppeteergif > processed ${frames}/${frames} frames`)
-  //Close encoder and convert to base64
-  encoder.finish()
-  const result = await fs.readFile(path, "base64")
-  await fs.unlink(path)
-  return `data:image/gif;base64,${result}`
 }
 
 /**D3 node wrapper (loosely based on https://github.com/d3-node/d3-node)*/

From e34c90b129ea4952a925715c95b4760ca4d6bd23 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 23 Aug 2023 22:59:52 -0400
Subject: [PATCH 145/196] fix(ci): octokit.request.defaults is not a function

mocking was not keeping functions with extra properties
---
 tests/mocks/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/mocks/index.mjs b/tests/mocks/index.mjs
index 67e34b9a42b..67fc1bb3735 100644
--- a/tests/mocks/index.mjs
+++ b/tests/mocks/index.mjs
@@ -70,7 +70,7 @@ export default async function({graphql, rest}) {
       for (const [key, value] of Object.entries(mocks)) {
         console.debug(`metrics/compute/mocks > mocking rest api > mocking ${path}.${key}`)
         if (typeof value === "function") {
-          unmocked[path] = value
+          unmocked[path] = Object.assign(value, mocked[key])
           mocked[key] = new Proxy(unmocked[path], {apply: value.bind(null, {faker})})
         }
         else {

From c8fa0b03691cd81a71cb52a2acff967054d179e7 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 23 Aug 2023 23:58:36 -0400
Subject: [PATCH 146/196] fix(ci): disable skyline for now as it's always
 returning 404

---
 .github/workflows/examples.yml      | 37 -----------------------------
 source/plugins/skyline/examples.yml |  6 +++++
 tests/cases/skyline.plugin.yml      | 34 +-------------------------
 3 files changed, 7 insertions(+), 70 deletions(-)

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 1d9709b1027..e0f905044d3 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -793,43 +793,6 @@ jobs:
           user: lowlighter
           plugins_errors_fatal: yes
         if: ${{ success() || failure() }}
-      - name: 🌇 GitHub Skyline - GitHub Skyline
-        uses: lowlighter/metrics@master
-        with:
-          filename: metrics.plugin.skyline.svg
-          token: NOT_NEEDED
-          base: ""
-          plugin_skyline: yes
-          plugin_skyline_year: 2020
-          plugin_skyline_frames: 6
-          plugin_skyline_quality: 1
-          output_action: none
-          delay: 120
-          user: lowlighter
-          plugins_errors_fatal: yes
-        if: ${{ success() || failure() }}
-      - name: 🌇 GitHub Skyline - GitHub City
-        uses: lowlighter/metrics@master
-        with:
-          filename: metrics.plugin.skyline.city.svg
-          token: NOT_NEEDED
-          base: ""
-          plugin_skyline: yes
-          plugin_skyline_year: 2020
-          plugin_skyline_frames: 6
-          plugin_skyline_quality: 1
-          plugin_skyline_settings: |
-            {
-              "url": "https://honzaap.github.io/GithubCity?name=${login}&year=${year}",
-              "ready": "[...document.querySelectorAll('.display-info span')].map(span => span.innerText).includes('${login}')",
-              "wait": 4,
-              "hide": ".github-corner, .footer-link, .buttons-options, .mobile-rotate, .display-info span:first-child"
-            }
-          output_action: none
-          delay: 120
-          user: lowlighter
-          plugins_errors_fatal: yes
-        if: ${{ success() || failure() }}
       - name: ⏱️ Google PageSpeed - Succinct report
         uses: lowlighter/metrics@master
         with:
diff --git a/source/plugins/skyline/examples.yml b/source/plugins/skyline/examples.yml
index 132dcf965f1..b8ec38a654f 100644
--- a/source/plugins/skyline/examples.yml
+++ b/source/plugins/skyline/examples.yml
@@ -12,6 +12,9 @@
     timeout: 1800000
     modes:
       - action
+    skip: true
+  prod:
+    skip: true # Currently skyline always return 404
 
 - name: GitHub City
   uses: lowlighter/metrics@latest
@@ -34,3 +37,6 @@
     timeout: 1800000
     modes:
       - action
+    skip: true
+  prod:
+    skip: true # Currently skyline always return 404
diff --git a/tests/cases/skyline.plugin.yml b/tests/cases/skyline.plugin.yml
index 303e28922b4..fe51488c706 100644
--- a/tests/cases/skyline.plugin.yml
+++ b/tests/cases/skyline.plugin.yml
@@ -1,33 +1 @@
-- name: 🌇 GitHub Skyline - GitHub Skyline
-  uses: lowlighter/metrics@latest
-  with:
-    token: NOT_NEEDED
-    plugin_skyline: 'yes'
-    plugin_skyline_year: 2020
-    plugin_skyline_frames: 6
-    plugin_skyline_quality: 1
-    use_mocked_data: 'yes'
-    verify: 'yes'
-  timeout: 1800000
-  modes:
-    - action
-- name: 🌇 GitHub Skyline - GitHub City
-  uses: lowlighter/metrics@latest
-  with:
-    token: NOT_NEEDED
-    plugin_skyline: 'yes'
-    plugin_skyline_year: 2020
-    plugin_skyline_frames: 6
-    plugin_skyline_quality: 1
-    plugin_skyline_settings: |
-      {
-        "url": "https://honzaap.github.io/GithubCity?name=${login}&year=${year}",
-        "ready": "[...document.querySelectorAll('.display-info span')].map(span => span.innerText).includes('${login}')",
-        "wait": 4,
-        "hide": ".github-corner, .footer-link, .buttons-options, .mobile-rotate, .display-info span:first-child"
-      }
-    use_mocked_data: 'yes'
-    verify: 'yes'
-  timeout: 1800000
-  modes:
-    - action
+[]

From 485f50249c544586ac7e4cfa701e22087d645ee5 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 00:09:17 -0400
Subject: [PATCH 147/196] chore: upgrade to node 20

---
 Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Dockerfile b/Dockerfile
index d95582fd0a1..3ff5209a48a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 # Base image
-FROM node:17.3-bullseye-slim
+FROM node:20-bookworm-slim
 
 # Copy repository
 COPY . /metrics

From 67d93c30480a3572b37e51b93c2baec1fdca6c96 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 17:48:49 -0400
Subject: [PATCH 148/196] chore: remove node-fetch to use native fetch

---
 .github/scripts/presets_examples.mjs | 1 -
 source/app/metrics/metadata.mjs      | 1 -
 source/app/metrics/presets.mjs       | 1 -
 source/app/metrics/utils.mjs         | 3 +--
 4 files changed, 1 insertion(+), 5 deletions(-)

diff --git a/.github/scripts/presets_examples.mjs b/.github/scripts/presets_examples.mjs
index 69d1d9542ea..0c281162912 100644
--- a/.github/scripts/presets_examples.mjs
+++ b/.github/scripts/presets_examples.mjs
@@ -2,7 +2,6 @@
 import processes from "child_process"
 import fs from "fs/promises"
 import yaml from "js-yaml"
-import fetch from "node-fetch"
 import paths from "path"
 import sgit from "simple-git"
 import url from "url"
diff --git a/source/app/metrics/metadata.mjs b/source/app/metrics/metadata.mjs
index 6da9131946c..8850fab1537 100644
--- a/source/app/metrics/metadata.mjs
+++ b/source/app/metrics/metadata.mjs
@@ -2,7 +2,6 @@
 import fs from "fs"
 import yaml from "js-yaml"
 import { marked } from "marked"
-import fetch from "node-fetch"
 import path from "path"
 import url from "url"
 
diff --git a/source/app/metrics/presets.mjs b/source/app/metrics/presets.mjs
index ce06f4cacef..39bd4934908 100644
--- a/source/app/metrics/presets.mjs
+++ b/source/app/metrics/presets.mjs
@@ -1,7 +1,6 @@
 //Imports
 import fs from "fs/promises"
 import yaml from "js-yaml"
-import fetch from "node-fetch"
 import metadata from "./metadata.mjs"
 
 /**Presets parser */
diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 29ae610dee9..346d1dfe754 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -14,7 +14,6 @@ import { JSDOM } from "jsdom"
 import linguist from "linguist-js"
 import { marked } from "marked"
 import { minimatch } from "minimatch"
-import fetch from "node-fetch"
 import opengraph from "open-graph-scraper"
 import os from "os"
 import paths from "path"
@@ -34,7 +33,7 @@ import xmlformat from "xml-formatter"
 prism_lang()
 
 //Exports
-export { axios, d3, emoji, fetch, fs, git, minimatch, opengraph, os, paths, processes, sharp, url, util }
+export { axios, d3, emoji, fs, git, minimatch, opengraph, os, paths, processes, sharp, url, util }
 
 /**Returns module __dirname */
 export function __module(module) {

From 3e717c17f6d05cd31f09be274b05a89469a40116 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 17:49:06 -0400
Subject: [PATCH 149/196] chore: update dependencies

---
 package-lock.json | 1657 ++++++++++++++++++++++++++-------------------
 package.json      |    5 +-
 2 files changed, 950 insertions(+), 712 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 10b3efd61b7..e01cbeac5ad 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -34,7 +34,6 @@
         "marked": "^7.0.4",
         "memory-cache": "^0.2.0",
         "minimatch": "^9.0.3",
-        "node-fetch": "^3.3.2",
         "open-graph-scraper": "^6.2.2",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
@@ -42,7 +41,7 @@
         "purgecss": "^5.0.0",
         "rss-parser": "^3.13.0",
         "sanitize-html": "^2.11.0",
-        "sharp": "^0.32.5",
+        "sharp": "^0.32.3",
         "simple-git": "^3.19.1",
         "svgo": "^3.0.2",
         "vue": "^2.7.1",
@@ -50,7 +49,7 @@
         "xml-formatter": "^3.5.0"
       },
       "devDependencies": {
-        "dprint": "^0.35.1",
+        "dprint": "^0.40.2",
         "eslint": "^8.47.0",
         "jest": "^29.6.3"
       },
@@ -94,9 +93,9 @@
       }
     },
     "node_modules/@actions/http-client": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.1.0.tgz",
-      "integrity": "sha512-BonhODnXr3amchh4qkmjPMUO8mFi/zLaaCeCAJZqch8iQqyDnVIkySjB38VHAC8IJ+bnlgfOqlhpyCUZHlQsqw==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.1.1.tgz",
+      "integrity": "sha512-qhrkRMB40bbbLo7gF+0vu+X+UawOvQQqNAA/5Unx774RS8poaOhThDOG6BGmxvAnxhQnDp2BG/ZUm65xZILTpw==",
       "dependencies": {
         "tunnel": "^0.0.6"
       }
@@ -200,9 +199,9 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.22.10",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.10.tgz",
-      "integrity": "sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==",
+      "version": "7.22.11",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz",
+      "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==",
       "dev": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
@@ -210,15 +209,15 @@
         "@babel/generator": "^7.22.10",
         "@babel/helper-compilation-targets": "^7.22.10",
         "@babel/helper-module-transforms": "^7.22.9",
-        "@babel/helpers": "^7.22.10",
-        "@babel/parser": "^7.22.10",
+        "@babel/helpers": "^7.22.11",
+        "@babel/parser": "^7.22.11",
         "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.10",
-        "@babel/types": "^7.22.10",
+        "@babel/traverse": "^7.22.11",
+        "@babel/types": "^7.22.11",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.2",
+        "json5": "^2.2.3",
         "semver": "^6.3.1"
       },
       "engines": {
@@ -235,6 +234,29 @@
       "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
       "dev": true
     },
+    "node_modules/@babel/core/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@babel/core/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
     "node_modules/@babel/core/node_modules/semver": {
       "version": "6.3.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
@@ -409,14 +431,14 @@
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.22.10",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.10.tgz",
-      "integrity": "sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==",
+      "version": "7.22.11",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz",
+      "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==",
       "dev": true,
       "dependencies": {
         "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.10",
-        "@babel/types": "^7.22.10"
+        "@babel/traverse": "^7.22.11",
+        "@babel/types": "^7.22.11"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -500,9 +522,9 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.22.10",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz",
-      "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==",
+      "version": "7.22.11",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.11.tgz",
+      "integrity": "sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -702,9 +724,9 @@
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.22.10",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.10.tgz",
-      "integrity": "sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==",
+      "version": "7.22.11",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz",
+      "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==",
       "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.22.10",
@@ -713,8 +735,8 @@
         "@babel/helper-function-name": "^7.22.5",
         "@babel/helper-hoist-variables": "^7.22.5",
         "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/parser": "^7.22.10",
-        "@babel/types": "^7.22.10",
+        "@babel/parser": "^7.22.11",
+        "@babel/types": "^7.22.11",
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       },
@@ -722,6 +744,23 @@
         "node": ">=6.9.0"
       }
     },
+    "node_modules/@babel/traverse/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@babel/traverse/node_modules/globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -731,10 +770,16 @@
         "node": ">=4"
       }
     },
+    "node_modules/@babel/traverse/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
     "node_modules/@babel/types": {
-      "version": "7.22.10",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz",
-      "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==",
+      "version": "7.22.11",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz",
+      "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==",
       "dev": true,
       "dependencies": {
         "@babel/helper-string-parser": "^7.22.5",
@@ -751,10 +796,88 @@
       "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
       "dev": true
     },
+    "node_modules/@dprint/darwin-arm64": {
+      "version": "0.40.2",
+      "resolved": "https://registry.npmjs.org/@dprint/darwin-arm64/-/darwin-arm64-0.40.2.tgz",
+      "integrity": "sha512-qharMFhxpNq9brgvHLbqzzAgVgPWSHLfzNLwWWhKcGOUUDUIilfAo3SlvOz6w4nQiIifLpYZOvZqK7Lpf9mSSw==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@dprint/darwin-x64": {
+      "version": "0.40.2",
+      "resolved": "https://registry.npmjs.org/@dprint/darwin-x64/-/darwin-x64-0.40.2.tgz",
+      "integrity": "sha512-FPDdOTVr1JfqtLBTCvqlihWslTy3LBUoi3H1gaqIazCKMj2dB9voFWkBiMT+REMHDrlVsoSpFAfsliNr/y7HPA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
+    },
+    "node_modules/@dprint/linux-arm64-glibc": {
+      "version": "0.40.2",
+      "resolved": "https://registry.npmjs.org/@dprint/linux-arm64-glibc/-/linux-arm64-glibc-0.40.2.tgz",
+      "integrity": "sha512-GmUWfKwEwXA+onvewX9hEJSMcd9V184+uRbEhI5tG28tBP9+IjQhrY7jCjxPvaZA+EvzNPnAy5D1wbJdlNLBNA==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@dprint/linux-x64-glibc": {
+      "version": "0.40.2",
+      "resolved": "https://registry.npmjs.org/@dprint/linux-x64-glibc/-/linux-x64-glibc-0.40.2.tgz",
+      "integrity": "sha512-vMHAHdsOY+2thieSWbIrIioDfPgvipwUgd0MZUWOqycTrXU6kLyi2B+5J/2Jc+QO3CiLIbumQd2FH/0vB1eWqA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@dprint/linux-x64-musl": {
+      "version": "0.40.2",
+      "resolved": "https://registry.npmjs.org/@dprint/linux-x64-musl/-/linux-x64-musl-0.40.2.tgz",
+      "integrity": "sha512-nFSbDWd9ORyOhJ7a+RmE39WbuPoQ3OQutIgfAmfikiu/wENzEwxxv4QJ7aFnBaoZb0wuVEEpXShr8vY4p0exkg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@dprint/win32-x64": {
+      "version": "0.40.2",
+      "resolved": "https://registry.npmjs.org/@dprint/win32-x64/-/win32-x64-0.40.2.tgz",
+      "integrity": "sha512-qF4VCQzFTZYD61lbQqXLU/IwUTbLK22CancO+uVtXmZRoKU9GaVjcBhMUB7URxsa8rvxWHhHT6ldillI/aOWCg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
     "node_modules/@eslint-community/eslint-utils": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz",
-      "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+      "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
       "dev": true,
       "dependencies": {
         "eslint-visitor-keys": "^3.3.0"
@@ -808,6 +931,23 @@
         "concat-map": "0.0.1"
       }
     },
+    "node_modules/@eslint/eslintrc/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@eslint/eslintrc/node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -820,6 +960,12 @@
         "node": "*"
       }
     },
+    "node_modules/@eslint/eslintrc/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
     "node_modules/@eslint/js": {
       "version": "8.47.0",
       "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz",
@@ -961,6 +1107,23 @@
         "concat-map": "0.0.1"
       }
     },
+    "node_modules/@humanwhocodes/config-array/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -973,6 +1136,12 @@
         "node": "*"
       }
     },
+    "node_modules/@humanwhocodes/config-array/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
     "node_modules/@humanwhocodes/module-importer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
@@ -1101,9 +1270,9 @@
       }
     },
     "node_modules/@jest/console": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.3.tgz",
-      "integrity": "sha512-ukZbHAdDH4ktZIOKvWs1juAXhiVAdvCyM8zv4S/7Ii3vJSDvMW5k+wOVGMQmHLHUFw3Ko63ZQNy7NI6PSlsD5w==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz",
+      "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.6.3",
@@ -1118,15 +1287,15 @@
       }
     },
     "node_modules/@jest/core": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.3.tgz",
-      "integrity": "sha512-skV1XrfNxfagmjRUrk2FyN5/2YwIzdWVVBa/orUfbLvQUANXxERq2pTvY0I+FinWHjDKB2HRmpveUiph4X0TJw==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz",
+      "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.6.3",
-        "@jest/reporters": "^29.6.3",
-        "@jest/test-result": "^29.6.3",
-        "@jest/transform": "^29.6.3",
+        "@jest/console": "^29.6.4",
+        "@jest/reporters": "^29.6.4",
+        "@jest/test-result": "^29.6.4",
+        "@jest/transform": "^29.6.4",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
@@ -1135,18 +1304,18 @@
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
         "jest-changed-files": "^29.6.3",
-        "jest-config": "^29.6.3",
-        "jest-haste-map": "^29.6.3",
+        "jest-config": "^29.6.4",
+        "jest-haste-map": "^29.6.4",
         "jest-message-util": "^29.6.3",
         "jest-regex-util": "^29.6.3",
-        "jest-resolve": "^29.6.3",
-        "jest-resolve-dependencies": "^29.6.3",
-        "jest-runner": "^29.6.3",
-        "jest-runtime": "^29.6.3",
-        "jest-snapshot": "^29.6.3",
+        "jest-resolve": "^29.6.4",
+        "jest-resolve-dependencies": "^29.6.4",
+        "jest-runner": "^29.6.4",
+        "jest-runtime": "^29.6.4",
+        "jest-snapshot": "^29.6.4",
         "jest-util": "^29.6.3",
         "jest-validate": "^29.6.3",
-        "jest-watcher": "^29.6.3",
+        "jest-watcher": "^29.6.4",
         "micromatch": "^4.0.4",
         "pretty-format": "^29.6.3",
         "slash": "^3.0.0",
@@ -1165,12 +1334,12 @@
       }
     },
     "node_modules/@jest/environment": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.3.tgz",
-      "integrity": "sha512-u/u3cCztYCfgBiGHsamqP5x+XvucftOGPbf5RJQxfpeC1y4AL8pCjKvPDA3oCmdhZYPgk5AE0VOD/flweR69WA==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz",
+      "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==",
       "dev": true,
       "dependencies": {
-        "@jest/fake-timers": "^29.6.3",
+        "@jest/fake-timers": "^29.6.4",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "jest-mock": "^29.6.3"
@@ -1180,22 +1349,22 @@
       }
     },
     "node_modules/@jest/expect": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.3.tgz",
-      "integrity": "sha512-Ic08XbI2jlg6rECy+CGwk/8NDa6VE7UmIG6++9OTPAMnQmNGY28hu69Nf629CWv6T7YMODLbONxDFKdmQeI9FA==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz",
+      "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==",
       "dev": true,
       "dependencies": {
-        "expect": "^29.6.3",
-        "jest-snapshot": "^29.6.3"
+        "expect": "^29.6.4",
+        "jest-snapshot": "^29.6.4"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/expect-utils": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.3.tgz",
-      "integrity": "sha512-nvOEW4YoqRKD9HBJ9OJ6przvIvP9qilp5nAn1462P5ZlL/MM9SgPEZFyjTGPfs7QkocdUsJa6KjHhyRn4ueItA==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz",
+      "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==",
       "dev": true,
       "dependencies": {
         "jest-get-type": "^29.6.3"
@@ -1205,9 +1374,9 @@
       }
     },
     "node_modules/@jest/fake-timers": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.3.tgz",
-      "integrity": "sha512-pa1wmqvbj6eX0nMvOM2VDAWvJOI5A/Mk3l8O7n7EsAh71sMZblaKO9iT4GjIj0LwwK3CP/Jp1ypEV0x3m89RvA==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz",
+      "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.6.3",
@@ -1222,13 +1391,13 @@
       }
     },
     "node_modules/@jest/globals": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.3.tgz",
-      "integrity": "sha512-RB+uI+CZMHntzlnOPlll5x/jgRff3LEPl/td/jzMXiIgR0iIhKq9qm1HLU+EC52NuoVy/1swit/sDGjVn4bc6A==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz",
+      "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.3",
-        "@jest/expect": "^29.6.3",
+        "@jest/environment": "^29.6.4",
+        "@jest/expect": "^29.6.4",
         "@jest/types": "^29.6.3",
         "jest-mock": "^29.6.3"
       },
@@ -1237,15 +1406,15 @@
       }
     },
     "node_modules/@jest/reporters": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.3.tgz",
-      "integrity": "sha512-kGz59zMi0GkVjD2CJeYWG9k6cvj7eBqt9aDAqo2rcCLRTYlvQ62Gu/n+tOmJMBHGjzeijjuCENjzTyYBgrtLUw==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz",
+      "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==",
       "dev": true,
       "dependencies": {
         "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^29.6.3",
-        "@jest/test-result": "^29.6.3",
-        "@jest/transform": "^29.6.3",
+        "@jest/console": "^29.6.4",
+        "@jest/test-result": "^29.6.4",
+        "@jest/transform": "^29.6.4",
         "@jest/types": "^29.6.3",
         "@jridgewell/trace-mapping": "^0.3.18",
         "@types/node": "*",
@@ -1261,7 +1430,7 @@
         "istanbul-reports": "^3.1.3",
         "jest-message-util": "^29.6.3",
         "jest-util": "^29.6.3",
-        "jest-worker": "^29.6.3",
+        "jest-worker": "^29.6.4",
         "slash": "^3.0.0",
         "string-length": "^4.0.1",
         "strip-ansi": "^6.0.0",
@@ -1306,12 +1475,12 @@
       }
     },
     "node_modules/@jest/test-result": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.3.tgz",
-      "integrity": "sha512-k7ZZaNvOSMBHPZYiy0kuiaFoyansR5QnTwDux1EjK3kD5iWpRVyJIJ0RAIV39SThafchuW59vra7F8mdy5Hfgw==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz",
+      "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.6.3",
+        "@jest/console": "^29.6.4",
         "@jest/types": "^29.6.3",
         "@types/istanbul-lib-coverage": "^2.0.0",
         "collect-v8-coverage": "^1.0.0"
@@ -1321,14 +1490,14 @@
       }
     },
     "node_modules/@jest/test-sequencer": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.3.tgz",
-      "integrity": "sha512-/SmijaAU2TY9ComFGIYa6Z+fmKqQMnqs2Nmwb0P/Z/tROdZ7M0iruES1EaaU9PBf8o9uED5xzaJ3YPFEIcDgAg==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz",
+      "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==",
       "dev": true,
       "dependencies": {
-        "@jest/test-result": "^29.6.3",
+        "@jest/test-result": "^29.6.4",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.3",
+        "jest-haste-map": "^29.6.4",
         "slash": "^3.0.0"
       },
       "engines": {
@@ -1336,9 +1505,9 @@
       }
     },
     "node_modules/@jest/transform": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.3.tgz",
-      "integrity": "sha512-dPIc3DsvMZ/S8ut4L2ViCj265mKO0owB0wfzBv2oGzL9pQ+iRvJewHqLBmsGb7XFb5UotWIEtvY5A/lnylaIoQ==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz",
+      "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
@@ -1349,7 +1518,7 @@
         "convert-source-map": "^2.0.0",
         "fast-json-stable-stringify": "^2.1.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.3",
+        "jest-haste-map": "^29.6.4",
         "jest-regex-util": "^29.6.3",
         "jest-util": "^29.6.3",
         "micromatch": "^4.0.4",
@@ -1434,15 +1603,36 @@
         "debug": "^4.1.1"
       }
     },
+    "node_modules/@kwsites/file-exists/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@kwsites/file-exists/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
     "node_modules/@kwsites/promise-deferred": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
       "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="
     },
     "node_modules/@mapbox/node-pre-gyp": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz",
-      "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==",
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz",
+      "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==",
       "optional": true,
       "dependencies": {
         "detect-libc": "^2.0.0",
@@ -1459,48 +1649,6 @@
         "node-pre-gyp": "bin/node-pre-gyp"
       }
     },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
-      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
-      "optional": true,
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
-      "optional": true
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
-      "optional": true
-    },
-    "node_modules/@mapbox/node-pre-gyp/node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "optional": true,
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -1696,44 +1844,6 @@
         "once": "^1.4.0"
       }
     },
-    "node_modules/@octokit/request/node_modules/node-fetch": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz",
-      "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/@octokit/request/node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
-    "node_modules/@octokit/request/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-    },
-    "node_modules/@octokit/request/node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
     "node_modules/@octokit/rest": {
       "version": "20.0.1",
       "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.0.1.tgz",
@@ -1947,24 +2057,42 @@
         "node": ">=16.3.0"
       }
     },
-    "node_modules/@puppeteer/browsers/node_modules/tar-fs": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
-      "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
+    "node_modules/@puppeteer/browsers/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dependencies": {
-        "mkdirp-classic": "^0.5.2",
-        "pump": "^3.0.0",
-        "tar-stream": "^3.1.5"
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
-    "node_modules/@puppeteer/browsers/node_modules/tar-stream": {
-      "version": "3.1.6",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
-      "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
+    "node_modules/@puppeteer/browsers/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/@puppeteer/browsers/node_modules/yargs": {
+      "version": "17.7.1",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
+      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
       "dependencies": {
-        "b4a": "^1.6.4",
-        "fast-fifo": "^1.2.0",
-        "streamx": "^2.15.0"
+        "cliui": "^8.0.1",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
+        "require-directory": "^2.1.1",
+        "string-width": "^4.2.3",
+        "y18n": "^5.0.5",
+        "yargs-parser": "^21.1.1"
+      },
+      "engines": {
+        "node": ">=12"
       }
     },
     "node_modules/@sinclair/typebox": {
@@ -2097,9 +2225,9 @@
       }
     },
     "node_modules/@types/node": {
-      "version": "18.15.0",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.0.tgz",
-      "integrity": "sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w==",
+      "version": "20.5.4",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.4.tgz",
+      "integrity": "sha512-Y9vbIAoM31djQZrPYjpTLo0XlaSwOIsrlfE3LpulZeRblttsLQRFRlBAppW0LOxyT3ALj2M5vU1ucQQayQH3jA==",
       "devOptional": true
     },
     "node_modules/@types/stack-utils": {
@@ -2197,14 +2325,33 @@
         "node": ">= 6.0.0"
       }
     },
+    "node_modules/agent-base/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/agent-base/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
     "node_modules/agentkeepalive": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz",
-      "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==",
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz",
+      "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==",
       "optional": true,
       "dependencies": {
-        "debug": "^4.1.0",
-        "depd": "^2.0.0",
         "humanize-ms": "^1.2.1"
       },
       "engines": {
@@ -2355,12 +2502,12 @@
       "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw=="
     },
     "node_modules/babel-jest": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.3.tgz",
-      "integrity": "sha512-1Ne93zZZEy5XmTa4Q+W5+zxBrDpExX8E3iy+xJJ+24ewlfo/T3qHfQJCzi/MMVFmBQDNxtRR/Gfd2dwb/0yrQw==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz",
+      "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==",
       "dev": true,
       "dependencies": {
-        "@jest/transform": "^29.6.3",
+        "@jest/transform": "^29.6.4",
         "@types/babel__core": "^7.1.14",
         "babel-plugin-istanbul": "^6.1.1",
         "babel-preset-jest": "^29.6.3",
@@ -2565,14 +2712,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/body-parser/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
     "node_modules/body-parser/node_modules/iconv-lite": {
       "version": "0.4.24",
       "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
@@ -2584,11 +2723,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/body-parser/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-    },
     "node_modules/boolbase": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
@@ -2761,9 +2895,9 @@
       ]
     },
     "node_modules/canvas": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.0.tgz",
-      "integrity": "sha512-bdTjFexjKJEwtIo0oRx8eD4G2yWoUOXP9lj279jmQ2zMnTQhT8C3512OKz3s+ZOaQlLbE7TuVvRDYDB3Llyy5g==",
+      "version": "2.11.2",
+      "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz",
+      "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==",
       "hasInstallScript": true,
       "optional": true,
       "dependencies": {
@@ -3032,19 +3166,6 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/compression/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/compression/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-    },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -3138,44 +3259,6 @@
         "node-fetch": "^2.6.12"
       }
     },
-    "node_modules/cross-fetch/node_modules/node-fetch": {
-      "version": "2.6.12",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz",
-      "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==",
-      "dependencies": {
-        "whatwg-url": "^5.0.0"
-      },
-      "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
-      },
-      "peerDependenciesMeta": {
-        "encoding": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/cross-fetch/node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
-    "node_modules/cross-fetch/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-    },
-    "node_modules/cross-fetch/node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
-    },
     "node_modules/cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -3270,9 +3353,9 @@
       }
     },
     "node_modules/csstype": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
-      "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+      "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
     },
     "node_modules/d3": {
       "version": "7.8.5",
@@ -3315,9 +3398,9 @@
       }
     },
     "node_modules/d3-array": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz",
-      "integrity": "sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==",
+      "version": "3.2.4",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz",
+      "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==",
       "dependencies": {
         "internmap": "1 - 2"
       },
@@ -3379,9 +3462,9 @@
       }
     },
     "node_modules/d3-delaunay": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz",
-      "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==",
+      "version": "6.0.4",
+      "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz",
+      "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==",
       "dependencies": {
         "delaunator": "5"
       },
@@ -3645,11 +3728,11 @@
       }
     },
     "node_modules/data-uri-to-buffer": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
-      "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz",
+      "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==",
       "engines": {
-        "node": ">= 12"
+        "node": ">= 14"
       }
     },
     "node_modules/data-urls": {
@@ -3666,19 +3749,11 @@
       }
     },
     "node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
       "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
+        "ms": "2.0.0"
       }
     },
     "node_modules/decimal.js": {
@@ -3696,28 +3771,15 @@
       }
     },
     "node_modules/decompress-response": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
-      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+      "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+      "optional": true,
       "dependencies": {
-        "mimic-response": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=10"
+        "mimic-response": "^2.0.0"
       },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/decompress-response/node_modules/mimic-response": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
-      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
       "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
+        "node": ">=8"
       }
     },
     "node_modules/dedent": {
@@ -3749,9 +3811,9 @@
       "dev": true
     },
     "node_modules/deepmerge": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz",
-      "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==",
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -3911,30 +3973,34 @@
       }
     },
     "node_modules/domutils": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
-      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+      "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
       "dependencies": {
         "dom-serializer": "^2.0.0",
         "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.1"
+        "domhandler": "^5.0.3"
       },
       "funding": {
         "url": "https://github.com/fb55/domutils?sponsor=1"
       }
     },
     "node_modules/dprint": {
-      "version": "0.35.1",
-      "resolved": "https://registry.npmjs.org/dprint/-/dprint-0.35.1.tgz",
-      "integrity": "sha512-x9ZbA5qtKEnMioQE8++lKIq3eZrwfP188wTOpuxVIEBxIYKKyZLp27klobIOcyNnZ5DnaxWmdbinX2e51WG9YQ==",
+      "version": "0.40.2",
+      "resolved": "https://registry.npmjs.org/dprint/-/dprint-0.40.2.tgz",
+      "integrity": "sha512-3LdyUV0itEW59UPtsRA2StOWOu8FyOW+BgvJpH/tACRHKi0z5gaQnvSxdS3mbG7dgtEhdRnGg6JoiQyGib6NTg==",
       "dev": true,
       "hasInstallScript": true,
-      "dependencies": {
-        "https-proxy-agent": "=5.0.1",
-        "yauzl": "=2.10.0"
-      },
       "bin": {
         "dprint": "bin.js"
+      },
+      "optionalDependencies": {
+        "@dprint/darwin-arm64": "0.40.2",
+        "@dprint/darwin-x64": "0.40.2",
+        "@dprint/linux-arm64-glibc": "0.40.2",
+        "@dprint/linux-x64-glibc": "0.40.2",
+        "@dprint/linux-x64-musl": "0.40.2",
+        "@dprint/win32-x64": "0.40.2"
       }
     },
     "node_modules/ee-first": {
@@ -4011,9 +4077,9 @@
       }
     },
     "node_modules/entities": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
-      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
       "engines": {
         "node": ">=0.12"
       },
@@ -4165,6 +4231,23 @@
         "concat-map": "0.0.1"
       }
     },
+    "node_modules/eslint/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/eslint/node_modules/minimatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -4177,6 +4260,12 @@
         "node": "*"
       }
     },
+    "node_modules/eslint/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
     "node_modules/espree": {
       "version": "9.6.1",
       "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
@@ -4295,14 +4384,14 @@
       }
     },
     "node_modules/expect": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.3.tgz",
-      "integrity": "sha512-x1vY4LlEMWUYVZQrFi4ZANXFwqYbJ/JNQspLVvzhW2BNY28aNcXMQH6imBbt+RBf5sVRTodYHXtSP/TLEU0Dxw==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz",
+      "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==",
       "dev": true,
       "dependencies": {
-        "@jest/expect-utils": "^29.6.3",
+        "@jest/expect-utils": "^29.6.4",
         "jest-get-type": "^29.6.3",
-        "jest-matcher-utils": "^29.6.3",
+        "jest-matcher-utils": "^29.6.4",
         "jest-message-util": "^29.6.3",
         "jest-util": "^29.6.3"
       },
@@ -4362,19 +4451,6 @@
         "express": "^4 || ^5"
       }
     },
-    "node_modules/express/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/express/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-    },
     "node_modules/express/node_modules/safe-buffer": {
       "version": "5.2.1",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -4413,6 +4489,22 @@
         "@types/yauzl": "^2.9.1"
       }
     },
+    "node_modules/extract-zip/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/extract-zip/node_modules/get-stream": {
       "version": "5.2.0",
       "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
@@ -4427,6 +4519,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/extract-zip/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
     "node_modules/fast-deep-equal": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -4434,9 +4531,9 @@
       "dev": true
     },
     "node_modules/fast-fifo": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.0.tgz",
-      "integrity": "sha512-IgfweLvEpwyA4WgiQe9Nx6VV2QkML2NkvZnk1oKnIzXgXdWxuhF7zw4DvLTPZJn6PIUneiAXPF24QmoEqHTjyw=="
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+      "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="
     },
     "node_modules/fast-json-stable-stringify": {
       "version": "2.1.0",
@@ -4476,28 +4573,6 @@
         "pend": "~1.2.0"
       }
     },
-    "node_modules/fetch-blob": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
-      "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/jimmywarting"
-        },
-        {
-          "type": "paypal",
-          "url": "https://paypal.me/jimmywarting"
-        }
-      ],
-      "dependencies": {
-        "node-domexception": "^1.0.0",
-        "web-streams-polyfill": "^3.0.3"
-      },
-      "engines": {
-        "node": "^12.20 || >= 14.13"
-      }
-    },
     "node_modules/file-entry-cache": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@@ -4589,19 +4664,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/finalhandler/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/finalhandler/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-    },
     "node_modules/find-up": {
       "version": "5.0.0",
       "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -4669,17 +4731,6 @@
         "node": ">= 6"
       }
     },
-    "node_modules/formdata-polyfill": {
-      "version": "4.0.10",
-      "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
-      "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
-      "dependencies": {
-        "fetch-blob": "^3.1.2"
-      },
-      "engines": {
-        "node": ">=12.20.0"
-      }
-    },
     "node_modules/forwarded": {
       "version": "0.2.0",
       "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -4714,14 +4765,6 @@
         "node": ">=6 <7 || >=8"
       }
     },
-    "node_modules/fs-extra/node_modules/universalify": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
-      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
-      "engines": {
-        "node": ">= 4.0.0"
-      }
-    },
     "node_modules/fs-minipass": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
@@ -4814,12 +4857,13 @@
       }
     },
     "node_modules/get-intrinsic": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz",
-      "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
       "dependencies": {
         "function-bind": "^1.1.1",
         "has": "^1.0.3",
+        "has-proto": "^1.0.1",
         "has-symbols": "^1.0.3"
       },
       "funding": {
@@ -4861,14 +4905,27 @@
         "node": ">= 14"
       }
     },
-    "node_modules/get-uri/node_modules/data-uri-to-buffer": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz",
-      "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==",
+    "node_modules/get-uri/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
       "engines": {
-        "node": ">= 14"
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
       }
     },
+    "node_modules/get-uri/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
     "node_modules/gifencoder": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/gifencoder/-/gifencoder-2.0.1.tgz",
@@ -4961,9 +5018,9 @@
       }
     },
     "node_modules/graceful-fs": {
-      "version": "4.2.10",
-      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
-      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
     },
     "node_modules/graphemer": {
       "version": "1.4.0",
@@ -4990,6 +5047,17 @@
         "node": ">=8"
       }
     },
+    "node_modules/has-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/has-symbols": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
@@ -5025,9 +5093,9 @@
       "dev": true
     },
     "node_modules/htmlparser2": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
-      "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+      "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
       "funding": [
         "https://github.com/fb55/htmlparser2?sponsor=1",
         {
@@ -5037,9 +5105,9 @@
       ],
       "dependencies": {
         "domelementtype": "^2.3.0",
-        "domhandler": "^5.0.2",
+        "domhandler": "^5.0.3",
         "domutils": "^3.0.1",
-        "entities": "^4.3.0"
+        "entities": "^4.4.0"
       }
     },
     "node_modules/http-errors": {
@@ -5070,6 +5138,27 @@
         "node": ">= 6"
       }
     },
+    "node_modules/http-proxy-agent/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/http-proxy-agent/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
     "node_modules/https-proxy-agent": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
@@ -5082,6 +5171,27 @@
         "node": ">= 6"
       }
     },
+    "node_modules/https-proxy-agent/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/https-proxy-agent/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
     "node_modules/human-signals": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
@@ -5404,6 +5514,29 @@
         "node": ">=10"
       }
     },
+    "node_modules/istanbul-lib-source-maps/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dev": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/istanbul-lib-source-maps/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "dev": true
+    },
     "node_modules/istanbul-reports": {
       "version": "3.1.6",
       "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
@@ -5423,14 +5556,14 @@
       "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw=="
     },
     "node_modules/jake": {
-      "version": "10.8.5",
-      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
-      "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
+      "version": "10.8.7",
+      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
+      "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
       "dependencies": {
         "async": "^3.2.3",
         "chalk": "^4.0.2",
-        "filelist": "^1.0.1",
-        "minimatch": "^3.0.4"
+        "filelist": "^1.0.4",
+        "minimatch": "^3.1.2"
       },
       "bin": {
         "jake": "bin/cli.js"
@@ -5460,15 +5593,15 @@
       }
     },
     "node_modules/jest": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.3.tgz",
-      "integrity": "sha512-alueLuoPCDNHFcFGmgETR4KpQ+0ff3qVaiJwxQM4B5sC0CvXcgg4PEi7xrDkxuItDmdz/FVc7SSit4KEu8GRvw==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz",
+      "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.6.3",
+        "@jest/core": "^29.6.4",
         "@jest/types": "^29.6.3",
         "import-local": "^3.0.2",
-        "jest-cli": "^29.6.3"
+        "jest-cli": "^29.6.4"
       },
       "bin": {
         "jest": "bin/jest.js"
@@ -5500,14 +5633,14 @@
       }
     },
     "node_modules/jest-circus": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.3.tgz",
-      "integrity": "sha512-p0R5YqZEMnOpHqHLWRSjm2z/0p6RNsrNE/GRRT3eli8QGOAozj6Ys/3Tv+Ej+IfltJoSPwcQ6/hOCRkNlxLLCw==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz",
+      "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.3",
-        "@jest/expect": "^29.6.3",
-        "@jest/test-result": "^29.6.3",
+        "@jest/environment": "^29.6.4",
+        "@jest/expect": "^29.6.4",
+        "@jest/test-result": "^29.6.4",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
@@ -5515,10 +5648,10 @@
         "dedent": "^1.0.0",
         "is-generator-fn": "^2.0.0",
         "jest-each": "^29.6.3",
-        "jest-matcher-utils": "^29.6.3",
+        "jest-matcher-utils": "^29.6.4",
         "jest-message-util": "^29.6.3",
-        "jest-runtime": "^29.6.3",
-        "jest-snapshot": "^29.6.3",
+        "jest-runtime": "^29.6.4",
+        "jest-snapshot": "^29.6.4",
         "jest-util": "^29.6.3",
         "p-limit": "^3.1.0",
         "pretty-format": "^29.6.3",
@@ -5531,19 +5664,19 @@
       }
     },
     "node_modules/jest-cli": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.3.tgz",
-      "integrity": "sha512-KuPdXUPXQIf0t6DvmG8MV4QyhcjR1a6ruKl3YL7aGn/AQ8JkROwFkWzEpDIpt11Qy188dHbRm8WjwMsV/4nmnQ==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz",
+      "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.6.3",
-        "@jest/test-result": "^29.6.3",
+        "@jest/core": "^29.6.4",
+        "@jest/test-result": "^29.6.4",
         "@jest/types": "^29.6.3",
         "chalk": "^4.0.0",
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
         "import-local": "^3.0.2",
-        "jest-config": "^29.6.3",
+        "jest-config": "^29.6.4",
         "jest-util": "^29.6.3",
         "jest-validate": "^29.6.3",
         "prompts": "^2.0.1",
@@ -5565,26 +5698,26 @@
       }
     },
     "node_modules/jest-config": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.3.tgz",
-      "integrity": "sha512-nb9bOq2aEqogbyL4F9mLkAeQGAgNt7Uz6U59YtQDIxFPiL7Ejgq0YIrp78oyEHD6H4CIV/k7mFrK7eFDzUJ69w==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz",
+      "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
-        "@jest/test-sequencer": "^29.6.3",
+        "@jest/test-sequencer": "^29.6.4",
         "@jest/types": "^29.6.3",
-        "babel-jest": "^29.6.3",
+        "babel-jest": "^29.6.4",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
         "deepmerge": "^4.2.2",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-circus": "^29.6.3",
-        "jest-environment-node": "^29.6.3",
+        "jest-circus": "^29.6.4",
+        "jest-environment-node": "^29.6.4",
         "jest-get-type": "^29.6.3",
         "jest-regex-util": "^29.6.3",
-        "jest-resolve": "^29.6.3",
-        "jest-runner": "^29.6.3",
+        "jest-resolve": "^29.6.4",
+        "jest-runner": "^29.6.4",
         "jest-util": "^29.6.3",
         "jest-validate": "^29.6.3",
         "micromatch": "^4.0.4",
@@ -5610,9 +5743,9 @@
       }
     },
     "node_modules/jest-diff": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.3.tgz",
-      "integrity": "sha512-3sw+AdWnwH9sSNohMRKA7JiYUJSRr/WS6+sEFfBuhxU5V5GlEVKfvUn8JuMHE0wqKowemR1C2aHy8VtXbaV8dQ==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz",
+      "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
@@ -5653,13 +5786,13 @@
       }
     },
     "node_modules/jest-environment-node": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.3.tgz",
-      "integrity": "sha512-PKl7upfPJXMYbWpD+60o4HP86KvFO2c9dZ+Zr6wUzsG5xcPx/65o3ArNgHW5M0RFvLYdW4/aieR4JSooD0a2ew==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz",
+      "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.3",
-        "@jest/fake-timers": "^29.6.3",
+        "@jest/environment": "^29.6.4",
+        "@jest/fake-timers": "^29.6.4",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "jest-mock": "^29.6.3",
@@ -5679,9 +5812,9 @@
       }
     },
     "node_modules/jest-haste-map": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.3.tgz",
-      "integrity": "sha512-GecR5YavfjkhOytEFHAeI6aWWG3f/cOKNB1YJvj/B76xAmeVjy4zJUYobGF030cRmKaO1FBw3V8CZZ6KVh9ZSw==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz",
+      "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.6.3",
@@ -5692,7 +5825,7 @@
         "graceful-fs": "^4.2.9",
         "jest-regex-util": "^29.6.3",
         "jest-util": "^29.6.3",
-        "jest-worker": "^29.6.3",
+        "jest-worker": "^29.6.4",
         "micromatch": "^4.0.4",
         "walker": "^1.0.8"
       },
@@ -5717,13 +5850,13 @@
       }
     },
     "node_modules/jest-matcher-utils": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.3.tgz",
-      "integrity": "sha512-6ZrMYINZdwduSt5Xu18/n49O1IgXdjsfG7NEZaQws9k69eTKWKcVbJBw/MZsjOZe2sSyJFmuzh8042XWwl54Zg==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz",
+      "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
-        "jest-diff": "^29.6.3",
+        "jest-diff": "^29.6.4",
         "jest-get-type": "^29.6.3",
         "pretty-format": "^29.6.3"
       },
@@ -5792,14 +5925,14 @@
       }
     },
     "node_modules/jest-resolve": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.3.tgz",
-      "integrity": "sha512-WMXwxhvzDeA/J+9jz1i8ZKGmbw/n+s988EiUvRI4egM+eTn31Hb5v10Re3slG3/qxntkBt2/6GkQVDGu6Bwyhw==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz",
+      "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.3",
+        "jest-haste-map": "^29.6.4",
         "jest-pnp-resolver": "^1.2.2",
         "jest-util": "^29.6.3",
         "jest-validate": "^29.6.3",
@@ -5812,43 +5945,43 @@
       }
     },
     "node_modules/jest-resolve-dependencies": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.3.tgz",
-      "integrity": "sha512-iah5nhSPTwtUV7yzpTc9xGg8gP3Ch2VNsuFMsKoCkNCrQSbFtx5KRPemmPJ32AUhTSDqJXB6djPN6zAaUGV53g==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz",
+      "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==",
       "dev": true,
       "dependencies": {
         "jest-regex-util": "^29.6.3",
-        "jest-snapshot": "^29.6.3"
+        "jest-snapshot": "^29.6.4"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-runner": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.3.tgz",
-      "integrity": "sha512-E4zsMhQnjhirFPhDTJgoLMWUrVCDij/KGzWlbslDHGuO8Hl2pVUfOiygMzVZtZq+BzmlqwEr7LYmW+WFLlmX8w==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz",
+      "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.6.3",
-        "@jest/environment": "^29.6.3",
-        "@jest/test-result": "^29.6.3",
-        "@jest/transform": "^29.6.3",
+        "@jest/console": "^29.6.4",
+        "@jest/environment": "^29.6.4",
+        "@jest/test-result": "^29.6.4",
+        "@jest/transform": "^29.6.4",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
         "graceful-fs": "^4.2.9",
         "jest-docblock": "^29.6.3",
-        "jest-environment-node": "^29.6.3",
-        "jest-haste-map": "^29.6.3",
+        "jest-environment-node": "^29.6.4",
+        "jest-haste-map": "^29.6.4",
         "jest-leak-detector": "^29.6.3",
         "jest-message-util": "^29.6.3",
-        "jest-resolve": "^29.6.3",
-        "jest-runtime": "^29.6.3",
+        "jest-resolve": "^29.6.4",
+        "jest-runtime": "^29.6.4",
         "jest-util": "^29.6.3",
-        "jest-watcher": "^29.6.3",
-        "jest-worker": "^29.6.3",
+        "jest-watcher": "^29.6.4",
+        "jest-worker": "^29.6.4",
         "p-limit": "^3.1.0",
         "source-map-support": "0.5.13"
       },
@@ -5857,17 +5990,17 @@
       }
     },
     "node_modules/jest-runtime": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.3.tgz",
-      "integrity": "sha512-VM0Z3a9xaqizGpEKwCOIhImkrINYzxgwk8oQAvrmAiXX8LNrJrRjyva30RkuRY0ETAotHLlUcd2moviCA1hgsQ==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz",
+      "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.3",
-        "@jest/fake-timers": "^29.6.3",
-        "@jest/globals": "^29.6.3",
+        "@jest/environment": "^29.6.4",
+        "@jest/fake-timers": "^29.6.4",
+        "@jest/globals": "^29.6.4",
         "@jest/source-map": "^29.6.3",
-        "@jest/test-result": "^29.6.3",
-        "@jest/transform": "^29.6.3",
+        "@jest/test-result": "^29.6.4",
+        "@jest/transform": "^29.6.4",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
@@ -5875,12 +6008,12 @@
         "collect-v8-coverage": "^1.0.0",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.3",
+        "jest-haste-map": "^29.6.4",
         "jest-message-util": "^29.6.3",
         "jest-mock": "^29.6.3",
         "jest-regex-util": "^29.6.3",
-        "jest-resolve": "^29.6.3",
-        "jest-snapshot": "^29.6.3",
+        "jest-resolve": "^29.6.4",
+        "jest-snapshot": "^29.6.4",
         "jest-util": "^29.6.3",
         "slash": "^3.0.0",
         "strip-bom": "^4.0.0"
@@ -5890,9 +6023,9 @@
       }
     },
     "node_modules/jest-snapshot": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.3.tgz",
-      "integrity": "sha512-66Iu7H1ojiveQMGFnKecHIZPPPBjZwfQEnF6wxqpxGf57sV3YSUtAb5/sTKM5TPa3OndyxZp1wxHFbmgVhc53w==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz",
+      "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
@@ -5900,16 +6033,16 @@
         "@babel/plugin-syntax-jsx": "^7.7.2",
         "@babel/plugin-syntax-typescript": "^7.7.2",
         "@babel/types": "^7.3.3",
-        "@jest/expect-utils": "^29.6.3",
-        "@jest/transform": "^29.6.3",
+        "@jest/expect-utils": "^29.6.4",
+        "@jest/transform": "^29.6.4",
         "@jest/types": "^29.6.3",
         "babel-preset-current-node-syntax": "^1.0.0",
         "chalk": "^4.0.0",
-        "expect": "^29.6.3",
+        "expect": "^29.6.4",
         "graceful-fs": "^4.2.9",
-        "jest-diff": "^29.6.3",
+        "jest-diff": "^29.6.4",
         "jest-get-type": "^29.6.3",
-        "jest-matcher-utils": "^29.6.3",
+        "jest-matcher-utils": "^29.6.4",
         "jest-message-util": "^29.6.3",
         "jest-util": "^29.6.3",
         "natural-compare": "^1.4.0",
@@ -5967,12 +6100,12 @@
       }
     },
     "node_modules/jest-watcher": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.3.tgz",
-      "integrity": "sha512-NgpFjZ2U2MKusjidbi4Oiu7tfs+nrgdIxIEVROvH1cFmOei9Uj25lwkMsakqLnH/s0nEcvxO1ck77FiRlcnpZg==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz",
+      "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==",
       "dev": true,
       "dependencies": {
-        "@jest/test-result": "^29.6.3",
+        "@jest/test-result": "^29.6.4",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
@@ -5986,9 +6119,9 @@
       }
     },
     "node_modules/jest-worker": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.3.tgz",
-      "integrity": "sha512-wacANXecZ/GbQakpf2CClrqrlwsYYDSXFd4fIGdL+dXpM2GWoJ+6bhQ7vR3TKi3+gkSfBkjy1/khH/WrYS4Q6g==",
+      "version": "29.6.4",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz",
+      "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==",
       "dev": true,
       "dependencies": {
         "@types/node": "*",
@@ -6248,9 +6381,9 @@
       }
     },
     "node_modules/make-dir/node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "optional": true,
       "bin": {
         "semver": "bin/semver.js"
@@ -6373,6 +6506,18 @@
         "node": ">=6"
       }
     },
+    "node_modules/mimic-response": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+      "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/minimatch": {
       "version": "9.0.3",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
@@ -6396,9 +6541,9 @@
       }
     },
     "node_modules/minipass": {
-      "version": "4.2.5",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.5.tgz",
-      "integrity": "sha512-+yQl7SX3bIT83Lhb4BVorMAHVuqsskxRdlmO9kTpyukp8vsm2Sn/fUOV9xlnG8/a5JsypJzap21lz/y3FBMJ8Q==",
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+      "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
       "optional": true,
       "engines": {
         "node": ">=8"
@@ -6458,9 +6603,9 @@
       "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="
     },
     "node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
     },
     "node_modules/nan": {
       "version": "2.17.0",
@@ -6469,9 +6614,15 @@
       "optional": true
     },
     "node_modules/nanoid": {
-      "version": "3.3.4",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
-      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
       "bin": {
         "nanoid": "bin/nanoid.cjs"
       },
@@ -6507,9 +6658,9 @@
       }
     },
     "node_modules/node-abi": {
-      "version": "3.33.0",
-      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz",
-      "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==",
+      "version": "3.47.0",
+      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz",
+      "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==",
       "dependencies": {
         "semver": "^7.3.5"
       },
@@ -6533,39 +6684,42 @@
         "node": ">= 8.0.0"
       }
     },
-    "node_modules/node-domexception": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
-      "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/jimmywarting"
-        },
-        {
-          "type": "github",
-          "url": "https://paypal.me/jimmywarting"
-        }
-      ],
-      "engines": {
-        "node": ">=10.5.0"
-      }
-    },
     "node_modules/node-fetch": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
-      "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
+      "version": "2.7.0",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
       "dependencies": {
-        "data-uri-to-buffer": "^4.0.0",
-        "fetch-blob": "^3.1.4",
-        "formdata-polyfill": "^4.0.10"
+        "whatwg-url": "^5.0.0"
       },
       "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+        "node": "4.x || >=6.0.0"
       },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/node-fetch"
+      "peerDependencies": {
+        "encoding": "^0.1.0"
+      },
+      "peerDependenciesMeta": {
+        "encoding": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/node-fetch/node_modules/tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
+    },
+    "node_modules/node-fetch/node_modules/webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
+    },
+    "node_modules/node-fetch/node_modules/whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+      "dependencies": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
       }
     },
     "node_modules/node-int64": {
@@ -6801,6 +6955,22 @@
         "node": ">= 14"
       }
     },
+    "node_modules/pac-proxy-agent/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
@@ -6825,6 +6995,11 @@
         "node": ">= 14"
       }
     },
+    "node_modules/pac-proxy-agent/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
     "node_modules/pac-resolver": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz",
@@ -7061,9 +7236,9 @@
       "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g=="
     },
     "node_modules/postcss": {
-      "version": "8.4.21",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz",
-      "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==",
+      "version": "8.4.28",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz",
+      "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==",
       "funding": [
         {
           "type": "opencollective",
@@ -7072,10 +7247,14 @@
         {
           "type": "tidelift",
           "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
         }
       ],
       "dependencies": {
-        "nanoid": "^3.3.4",
+        "nanoid": "^3.3.6",
         "picocolors": "^1.0.0",
         "source-map-js": "^1.0.2"
       },
@@ -7084,9 +7263,9 @@
       }
     },
     "node_modules/postcss-selector-parser": {
-      "version": "6.0.11",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz",
-      "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==",
+      "version": "6.0.13",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+      "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
       "dependencies": {
         "cssesc": "^3.0.0",
         "util-deprecate": "^1.0.2"
@@ -7120,6 +7299,36 @@
         "node": ">=10"
       }
     },
+    "node_modules/prebuild-install/node_modules/chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+    },
+    "node_modules/prebuild-install/node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "dependencies": {
+        "mimic-response": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/prebuild-install/node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/prebuild-install/node_modules/simple-get": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
@@ -7144,6 +7353,32 @@
         "simple-concat": "^1.0.0"
       }
     },
+    "node_modules/prebuild-install/node_modules/tar-fs": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
+      "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+      "dependencies": {
+        "chownr": "^1.1.1",
+        "mkdirp-classic": "^0.5.2",
+        "pump": "^3.0.0",
+        "tar-stream": "^2.1.4"
+      }
+    },
+    "node_modules/prebuild-install/node_modules/tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "dependencies": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/prelude-ls": {
       "version": "1.2.1",
       "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -7249,6 +7484,22 @@
         "node": ">= 14"
       }
     },
+    "node_modules/proxy-agent/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/proxy-agent/node_modules/http-proxy-agent": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
@@ -7281,6 +7532,11 @@
         "node": ">=12"
       }
     },
+    "node_modules/proxy-agent/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
     "node_modules/proxy-from-env": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@@ -7346,43 +7602,26 @@
         "node-fetch": "^2.6.12"
       }
     },
-    "node_modules/puppeteer-core/node_modules/node-fetch": {
-      "version": "2.7.0",
-      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
-      "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+    "node_modules/puppeteer-core/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
       "dependencies": {
-        "whatwg-url": "^5.0.0"
+        "ms": "2.1.2"
       },
       "engines": {
-        "node": "4.x || >=6.0.0"
-      },
-      "peerDependencies": {
-        "encoding": "^0.1.0"
+        "node": ">=6.0"
       },
       "peerDependenciesMeta": {
-        "encoding": {
+        "supports-color": {
           "optional": true
         }
       }
     },
-    "node_modules/puppeteer-core/node_modules/tr46": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
-      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
-    },
-    "node_modules/puppeteer-core/node_modules/webidl-conversions": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
-      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
-    },
-    "node_modules/puppeteer-core/node_modules/whatwg-url": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
-      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
-      "dependencies": {
-        "tr46": "~0.0.3",
-        "webidl-conversions": "^3.0.0"
-      }
+    "node_modules/puppeteer-core/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
     "node_modules/pure-rand": {
       "version": "6.0.2",
@@ -7716,9 +7955,9 @@
       }
     },
     "node_modules/robust-predicates": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz",
-      "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g=="
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz",
+      "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="
     },
     "node_modules/rrweb-cssom": {
       "version": "0.6.0",
@@ -7898,19 +8137,6 @@
         "node": ">= 0.8.0"
       }
     },
-    "node_modules/send/node_modules/debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "dependencies": {
-        "ms": "2.0.0"
-      }
-    },
-    "node_modules/send/node_modules/debug/node_modules/ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
-    },
     "node_modules/send/node_modules/ms": {
       "version": "2.1.3",
       "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -7942,13 +8168,13 @@
       "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
     },
     "node_modules/sharp": {
-      "version": "0.32.5",
-      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.5.tgz",
-      "integrity": "sha512-0dap3iysgDkNaPOaOL4X/0akdu0ma62GcdC2NBQ+93eqpePdDdr2/LM0sFdDSMmN7yS+odyZtPsb7tx/cYBKnQ==",
+      "version": "0.32.3",
+      "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.3.tgz",
+      "integrity": "sha512-i1gFPiNqyqxC4ouVvCKj5G8WfPIMeeSxpKcMrjic6NY4e8zktW7bIdqHPc3FCG+pNKU/XCEabKA57hhvZi8UmQ==",
       "hasInstallScript": true,
       "dependencies": {
         "color": "^4.2.3",
-        "detect-libc": "^2.0.2",
+        "detect-libc": "^2.0.1",
         "node-addon-api": "^6.1.0",
         "prebuild-install": "^7.1.1",
         "semver": "^7.5.4",
@@ -7963,6 +8189,31 @@
         "url": "https://opencollective.com/libvips"
       }
     },
+    "node_modules/sharp/node_modules/decompress-response": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+      "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+      "dependencies": {
+        "mimic-response": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/sharp/node_modules/mimic-response": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+      "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/sharp/node_modules/simple-get": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
@@ -7987,26 +8238,6 @@
         "simple-concat": "^1.0.0"
       }
     },
-    "node_modules/sharp/node_modules/tar-fs": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
-      "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
-      "dependencies": {
-        "mkdirp-classic": "^0.5.2",
-        "pump": "^3.0.0",
-        "tar-stream": "^3.1.5"
-      }
-    },
-    "node_modules/sharp/node_modules/tar-stream": {
-      "version": "3.1.6",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
-      "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
-      "dependencies": {
-        "b4a": "^1.6.4",
-        "fast-fifo": "^1.2.0",
-        "streamx": "^2.15.0"
-      }
-    },
     "node_modules/shebang-command": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
@@ -8077,30 +8308,6 @@
         "simple-concat": "^1.0.0"
       }
     },
-    "node_modules/simple-get/node_modules/decompress-response": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
-      "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
-      "optional": true,
-      "dependencies": {
-        "mimic-response": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/simple-get/node_modules/mimic-response": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
-      "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
-      "optional": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/simple-git": {
       "version": "3.19.1",
       "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.19.1.tgz",
@@ -8115,6 +8322,27 @@
         "url": "https://github.com/steveukx/git-js?sponsor=1"
       }
     },
+    "node_modules/simple-git/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/simple-git/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
     "node_modules/simple-swizzle": {
       "version": "0.2.2",
       "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -8189,6 +8417,27 @@
         "node": ">= 14"
       }
     },
+    "node_modules/socks-proxy-agent/node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/socks-proxy-agent/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
     "node_modules/socks/node_modules/ip": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
@@ -8273,9 +8522,9 @@
       }
     },
     "node_modules/streamx": {
-      "version": "2.15.0",
-      "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.0.tgz",
-      "integrity": "sha512-HcxY6ncGjjklGs1xsP1aR71INYcsXFJet5CU1CHqihQ2J5nOsbd4OjgjHO42w/4QNv9gZb3BueV+Vxok5pLEXg==",
+      "version": "2.15.1",
+      "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz",
+      "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==",
       "dependencies": {
         "fast-fifo": "^1.1.0",
         "queue-tick": "^1.0.1"
@@ -8452,14 +8701,14 @@
       "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="
     },
     "node_modules/tar": {
-      "version": "6.1.13",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz",
-      "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==",
+      "version": "6.1.15",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz",
+      "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==",
       "optional": true,
       "dependencies": {
         "chownr": "^2.0.0",
         "fs-minipass": "^2.0.0",
-        "minipass": "^4.0.0",
+        "minipass": "^5.0.0",
         "minizlib": "^2.1.1",
         "mkdirp": "^1.0.3",
         "yallist": "^4.0.0"
@@ -8469,34 +8718,23 @@
       }
     },
     "node_modules/tar-fs": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
-      "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
+      "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
       "dependencies": {
-        "chownr": "^1.1.1",
         "mkdirp-classic": "^0.5.2",
         "pump": "^3.0.0",
-        "tar-stream": "^2.1.4"
+        "tar-stream": "^3.1.5"
       }
     },
-    "node_modules/tar-fs/node_modules/chownr": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
-    },
     "node_modules/tar-stream": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
-      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "version": "3.1.6",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
+      "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
       "dependencies": {
-        "bl": "^4.0.3",
-        "end-of-stream": "^1.4.1",
-        "fs-constants": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^3.1.1"
-      },
-      "engines": {
-        "node": ">=6"
+        "b4a": "^1.6.4",
+        "fast-fifo": "^1.2.0",
+        "streamx": "^2.15.0"
       }
     },
     "node_modules/tar/node_modules/yallist": {
@@ -8609,9 +8847,9 @@
       }
     },
     "node_modules/tough-cookie": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz",
-      "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==",
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz",
+      "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==",
       "dependencies": {
         "psl": "^1.1.33",
         "punycode": "^2.1.1",
@@ -8622,6 +8860,14 @@
         "node": ">=6"
       }
     },
+    "node_modules/tough-cookie/node_modules/universalify": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
     "node_modules/tr46": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/tr46/-/tr46-4.1.1.tgz",
@@ -8712,9 +8958,9 @@
       }
     },
     "node_modules/undici": {
-      "version": "5.22.1",
-      "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz",
-      "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==",
+      "version": "5.23.0",
+      "resolved": "https://registry.npmjs.org/undici/-/undici-5.23.0.tgz",
+      "integrity": "sha512-1D7w+fvRsqlQ9GscLBwcAJinqcZGHUKjbOmXdlE/v8BvEGXjeWAax+341q44EuTcHXXnfyKNbKRq4Lg7OzhMmg==",
       "dependencies": {
         "busboy": "^1.6.0"
       },
@@ -8728,9 +8974,9 @@
       "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w=="
     },
     "node_modules/universalify": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
-      "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+      "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
       "engines": {
         "node": ">= 4.0.0"
       }
@@ -8833,9 +9079,9 @@
       "dev": true
     },
     "node_modules/validator": {
-      "version": "13.9.0",
-      "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz",
-      "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==",
+      "version": "13.11.0",
+      "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz",
+      "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==",
       "engines": {
         "node": ">= 0.10"
       }
@@ -8882,14 +9128,6 @@
         "makeerror": "1.0.12"
       }
     },
-    "node_modules/web-streams-polyfill": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
-      "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
-      "engines": {
-        "node": ">= 8"
-      }
-    },
     "node_modules/webidl-conversions": {
       "version": "7.0.0",
       "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
@@ -9080,9 +9318,10 @@
       "dev": true
     },
     "node_modules/yargs": {
-      "version": "17.7.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
-      "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
+      "version": "17.7.2",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+      "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+      "dev": true,
       "dependencies": {
         "cliui": "^8.0.1",
         "escalade": "^3.1.1",
diff --git a/package.json b/package.json
index dc9cb294311..f35c4ef05c5 100644
--- a/package.json
+++ b/package.json
@@ -53,7 +53,6 @@
     "marked": "^7.0.4",
     "memory-cache": "^0.2.0",
     "minimatch": "^9.0.3",
-    "node-fetch": "^3.3.2",
     "open-graph-scraper": "^6.2.2",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
@@ -61,7 +60,7 @@
     "purgecss": "^5.0.0",
     "rss-parser": "^3.13.0",
     "sanitize-html": "^2.11.0",
-    "sharp": "^0.32.5",
+    "sharp": "^0.32.3",
     "simple-git": "^3.19.1",
     "svgo": "^3.0.2",
     "vue": "^2.7.1",
@@ -69,7 +68,7 @@
     "xml-formatter": "^3.5.0"
   },
   "devDependencies": {
-    "dprint": "^0.35.1",
+    "dprint": "^0.40.2",
     "eslint": "^8.47.0",
     "jest": "^29.6.3"
   },

From f06c102e6a252a1cbb038059c772fe66ecc1a3ac Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 17:49:19 -0400
Subject: [PATCH 150/196] fix(tests): faker moved api

---
 tests/mocks/api/github/rest/users/listGpgKeysForUser.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/mocks/api/github/rest/users/listGpgKeysForUser.mjs b/tests/mocks/api/github/rest/users/listGpgKeysForUser.mjs
index da9515131d4..84ea46f836d 100644
--- a/tests/mocks/api/github/rest/users/listGpgKeysForUser.mjs
+++ b/tests/mocks/api/github/rest/users/listGpgKeysForUser.mjs
@@ -11,7 +11,7 @@ export default async function({faker}, target, that, [{username}]) {
     },
     data: [
       {
-        key_id: faker.datatype.hexaDecimal(16),
+        key_id: faker.datatype.hexadecimal(16),
         raw_key: "-----BEGIN PGP PUBLIC KEY BLOCK-----\n(dummy content)\n-----END PGP PUBLIC KEY BLOCK-----",
         emails: [
           {

From f5a958ab779e26ea11a30d8daa88772e241ab247 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 17:51:59 -0400
Subject: [PATCH 151/196] fix(tests): change how `Proxy` is used for octokit
 rest

It seems that rest octokit is alredy using some kind of meta-programming with conflicts with the way of how metrics mocks data (assignement does not override value, despite `writable: true, configurable: true` as property descriptors, and ends up hitting the real api). current fix will only support 2 level depth, but should be good enough for now
---
 tests/mocks/index.mjs | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/tests/mocks/index.mjs b/tests/mocks/index.mjs
index 67fc1bb3735..27c68db6778 100644
--- a/tests/mocks/index.mjs
+++ b/tests/mocks/index.mjs
@@ -64,21 +64,27 @@ export default async function({graphql, rest}) {
   {
     //Unmocked
     console.debug("metrics/compute/mocks > mocking rest api")
-    const unmocked = {}
+    const unmocked = rest
+
     //Mocked
-    const mocker = ({path = "rest", mocks, mocked}) => {
-      for (const [key, value] of Object.entries(mocks)) {
-        console.debug(`metrics/compute/mocks > mocking rest api > mocking ${path}.${key}`)
-        if (typeof value === "function") {
-          unmocked[path] = Object.assign(value, mocked[key])
-          mocked[key] = new Proxy(unmocked[path], {apply: value.bind(null, {faker})})
-        }
-        else {
-          mocker({path: `${path}.${key}`, mocks: mocks[key], mocked: mocked[key]})
+    rest = new Proxy(unmocked, {
+      get(target, section) {
+        if (Reflect.has(mocks.github.rest, section)) {
+          return new Proxy(target[section], {
+            get(target, property) {
+              if (mocks.github.rest?.[section]?.[property]) {
+                return async function () {
+                  console.debug(`metrics/mocking > rest.${section}.${property}`)
+                  return mocks.github.rest[section][property]({faker}, target, null, arguments)
+                }
+              }
+              return Reflect.get(target, property)
+            }
+          })
         }
+        return Reflect.get(target, section)
       }
-    }
-    mocker({mocks: mocks.github.rest, mocked: rest})
+    })
   }
 
   //Axios mocking

From bfeb5c452ceca4bfc3c3fbae0884bb1728dde68c Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 24 Aug 2023 22:33:16 +0000
Subject: [PATCH 152/196] chore: code formatting

---
 .../app/web/statics/embed/app.placeholder.js  | 22 +++++++-------
 tests/mocks/api/axios/get/lastfm.mjs          | 24 +++++++--------
 tests/mocks/api/axios/get/spotify.mjs         | 18 +++++------
 tests/mocks/api/axios/get/twitter.mjs         |  2 +-
 tests/mocks/api/axios/post/anilist.mjs        |  2 +-
 tests/mocks/api/github/graphql/base.user.mjs  |  4 +--
 .../api/github/graphql/stargazers.default.mjs |  2 +-
 .../api/github/graphql/stars.default.mjs      |  2 +-
 .../listEventsForAuthenticatedUser.mjs        | 30 +++++++++----------
 .../api/github/rest/repos/listCommits.mjs     |  4 +--
 tests/mocks/api/github/rest/request.mjs       |  4 +--
 tests/mocks/index.mjs                         |  6 ++--
 12 files changed, 60 insertions(+), 60 deletions(-)

diff --git a/source/app/web/statics/embed/app.placeholder.js b/source/app/web/statics/embed/app.placeholder.js
index 130c093ac91..f36e248d204 100644
--- a/source/app/web/statics/embed/app.placeholder.js
+++ b/source/app/web/statics/embed/app.placeholder.js
@@ -103,7 +103,7 @@
         databaseId: faker.number.int(10000000),
         name: "(placeholder)",
         login: set.user || "metrics",
-        createdAt: `${faker.date.past({ years:10})}`,
+        createdAt: `${faker.date.past({years: 10})}`,
         avatarUrl: set.avatar,
         websiteUrl: options["pagespeed.url"] || "(attached website)",
         isHireable: options["base.hireable"],
@@ -137,7 +137,7 @@
             tweets: {
               username: options["tweets.user"] || "(attached Twitter account)",
               profile: {
-                profile_image_url: faker.image.urlLoremFlickr({ category: 'people' }),
+                profile_image_url: faker.image.urlLoremFlickr({category: "people"}),
                 name: "",
                 verified: false,
                 id: faker.number.int(1000000).toString(),
@@ -998,7 +998,7 @@
                   name: faker.lorem.words(),
                   type,
                   status: faker.helpers.arrayElement(["FINISHED", "RELEASING", "NOT_YET_RELEASED", "CANCELLED", "HIATUS"]),
-                  release: faker.date.past({years:20}).getFullYear(),
+                  release: faker.date.past({years: 20}).getFullYear(),
                   genres: new Array(6).fill(null).map(_ => faker.lorem.word()),
                   progress: faker.number.int(100),
                   description: faker.lorem.paragraphs(),
@@ -1043,7 +1043,7 @@
               player: {
                 level: faker.number.int(100),
                 avatar: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mOcOnfpfwAGfgLYttYINwAAAABJRU5ErkJggg==",
-                created: faker.date.recent({days:10}).getTime(),
+                created: faker.date.recent({days: 10}).getTime(),
                 name: faker.internet.userName(),
               },
               games: {
@@ -1057,7 +1057,7 @@
                     icon:
                       "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCABAAEADASIAAhEBAxEB/8QAHAAAAgMBAQEBAAAAAAAAAAAABgcFCAkEAwEA/8QAMBAAAQMDAwEGBQQDAAAAAAAAAQIDBAAFEQYHITESExQiQVEjMkJhcQhSobEVgcH/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8ArPebk9cpIW+U8D0FcJUTj39q+Kxnjp6VN6N0zcdV3xi12lpTjzqgCoDIQPc0EKlZ6YJI6Yrvt1oudwIRAhPPqV+1NXb252F01pmHGfuDHjLoPMtazlGfbsmmoxZbXHwI9uhN4/aykH+qDNa5afvNsBE+3vsgj6k1EqKgeRhXTmtQXbTb3jh6BEcT7LZSo/yKXevNktKaqbkOGGIk5acNuMnsJSfwKCgXbUlWfqrpts12DLS8zgqB5yKJNydDXLQl9ct9xQe7J+G5jhQ9KEU/MMUH5XUZOR9qu1+l7Q8fS+jDfLk0lufLyVLWPlb6giqdaYgpueorfDI8rzoSRWhGpbZKe20MK15D6YiEoSnqSAKCMTuzZv8AMeFUy6Ifb7vx2fhAjqKYTD7chpDzCgttYCkqHQikM3fbEnbB6yqhpevThU34NKfi9vI82cUz9EKfs+lILd+eS24oAISRykY4BoC5RwCSQPzS9uu6tmgXZcRCHJEdo4elIPkb980R3iWLvZp8ayS21TO78uOopC27VtqsGjLzpm/2l1m8rU4UhxIKpBUrjBxQMHfPSkDX+3L8yEEPSmGy9GcQOSeOKoU60piQ404PM2opUPYjitDNl7XPg6Ebau6VBTqlLS2vqlB6CqQbsWtFn3AusZsdlJcLmPyTQRGkZibfqq2ynD5Wngo1ou5Pks6et8yE33iCyhS04z5SkVmecpWCnqORV7/0266Z1ZoliHJfQq5RPI40evYHAoCKdqvR0BwyViCLljPd9gBeag7rutF75pk2N98k+TBHP4rx3F2YiX68qvlqfVGuSQMIUSUEj7UAzdtNwo0pl+LLjPOtqzgNelAwY+58W3zA2rT8lhx35jkDipuJrLRV5mI8aICbik5Sh5sKXn84pSx9ttwrhOW7cJUdBUAAe66Ue6G2WhWq6ovF+f8AG3JGCgtkpQD9x60DMtEp+WHHFoCI2MN4GOKz73lnouW410eRyAstjHuCauzvNrGLonQ81/vEty3GyiMgcEqrPSXJXMmyJLxy68srJ+5OaDxX81EOhNWXHR1/YudsdUlTagVIB4UPYioi4wZEJ/upCCleM1yhJ59KC/8AtzvRpnV8NhLstuFcSACw6rlSvXFM5JT84UCFDg54rLZpx1hxLsdS2lJ6KScEf7ootm4OqbatCmLvJV2eneOFQ/ug0jzzyefzQDr3dfTOjWHRMnNPTUDiM2rzVR27bjaruR7Ui7SEk8ZbWU/9oXlyZEt0uS3nH3T9S1FR/mgLd0df3LXl9cmTVqEYKIaazwkenFBaeo9K+dk56V7w4zsqQGWkFS1dAKD/2Q==",
                     playtime: faker.number.int(100),
-                    played: faker.date.recent({days:10}).getTime(),
+                    played: faker.date.recent({days: 10}).getTime(),
                     description: "NieR: Automata tells the story of androids 2B, 9S and A2 and their battle to reclaim the machine-driven dystopia overrun by powerful machines.",
                     genres: [
                       "Action",
@@ -1068,7 +1068,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAUGBwP/xAAmEAABAgQDCQAAAAAAAAAAAAABAAIDBAUGBxIUFiMxNVNhc5Gx/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAME/8QAFBEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEQMRAD8A6XVcM5QqlppTK+G4GJvSXEEngOyT7d1TpwPRRiVz5niH0qTWNVWbd1TpwPRTi1bhnK7UtNN5WQ2gRN0S0kg8D2Wdqsw158/xH6EBiVz5niH0qTWiXVb05XalqZTKyG0GHvQWkkHiOyT7CVTqQPZQSarMNefP8R+hGwlU6kD2U4tW3pyhVLUzeV8NwEPdAuIJPE9kH//Z",
                         achieved: true,
-                        unlocked: faker.date.recent({days:10}).getTime(),
+                        unlocked: faker.date.recent({days: 10}).getTime(),
                         name: "Transcendent Being",
                         description: "",
                         id: "ACH_BAD_END",
@@ -1077,7 +1077,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAABQQDAAL/xAAtEAABAwMCBAQGAwAAAAAAAAABAgMEAAURBiISITFBExQjMlFhcYGRsRXB0f/EABcBAQEBAQAAAAAAAAAAAAAAAAABAwT/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwC3UF7lWeeY8bc2rLnqKJIJPT6VhE1BdpCgAhtORy2qJ/ArxqprxtRIB7IH7pixMJZfZWOQPEB+DXG1FSL/AHhj3soB64IINU6evMm8TvLytqEYX6aikkg9D8vlSmomEPcK8hWEYIznuaE0uz4N/cx3R/dQdqdt3+cDkfgUtLZ2LOAr4DPaqbOiDeZrcW4w5cd2Mkq3HiQVBW4Ajl7eX3OOlb3W2yLjMMiPxJSklO9JByDjP0q+2tzIiAlyO27j4k1QfdotvsD7zjEOa9Hkoy64yBhrh6de2P1U2mXmpN2W8wh5Dakjh8UYKh3OKcuKZUpspbitNkjBOT/tHWu3yLfN8xJClpWQnYkqIyeX2oP/2Q==",
                         achieved: true,
-                        unlocked: faker.date.recent({days:10}).getTime(),
+                        unlocked: faker.date.recent({days: 10}).getTime(),
                         name: "A Round by the Pond",
                         description: "20 different kinds of fish caught.",
                         id: "ACH_FISHING",
@@ -1096,7 +1096,7 @@
                     icon:
                       "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCABAAEADASIAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAABgcDBQEECAIA/8QAMBAAAQMDAgUCBgEFAQAAAAAAAQIDBAAFERIhBhMxQVEHYRQiIzJCcRUIJFJigcH/xAAYAQADAQEAAAAAAAAAAAAAAAABAgMABP/EAB8RAAICAwACAwAAAAAAAAAAAAABAhEDEiEEQSIxYf/aAAwDAQACEQMRAD8A6m228CgT1PmN/DtMDd1s6z+jRfebg3abVJnSN2mEa1fqubeKOOBxNcBYoTwTcpaylxfX6Z+0DwaWT9FsMbezNluY5e3Jdpt0hoMqRh94jIx4HvV9ZbVHs0NMa3r5YTuvmb6vcV9Bsjdkt6GorJ0gfMvuVd81aWpUfWEqBKldSqpHV+lhHZCmNTbqSfyFYdjoQgKdSS0fzHQVOuGIriXUk8rqfet55DcVkTYg5jB+9pW9YWynjKkR5BcjFL7H+o3o1tPEbbiEtyxy1dM0K3S2amhMthUjI1AZ2J8YrUtt6DTyBcGg2UnAKhso0U6BKCmi09dLkm3cEvLdUUtuZSrfqKQ/oPbbchM6+SAVzHCUoKznAB2xTj/qVZMn08faQkqdVnTjzQF6dQmWOD4fKQOcjdxI/VNJ0LiXxDNy5FlvXo5jRPzHskeTUciNFmR0vwZCQ71Tg7ZoUeW6J5nWtZkxSdDzIOdGKEo/FlxmcQqZiwHmilWFJ7Y84qd2X1G1br4/8O7BeSEuDrqGc/qpLZc+RJMaUfpObJBPehlm6KU+0uc1yXBsVEdRUvEENu5RNKlrQtr6jC0Kxk1vsDjQfEKjRgw25g5K0at+teNUG5RXTIbCHEjC09/2KHrRc0XaAwlSyHUfTO++1ef5Q2+4FqajY7ax0Ioi6tBd6o2r+QjxtassqUQR2G1IK4sXPh65MXC3zELjh0pcjAbhI710h6gsvOWlHJISkElRPakTxE6yxqclIPwh+Vah296M+MGDsFZZw1CU4LjDQYsh0AOxldFjyBWxHgMc9UlLaQ6vZeBUMN2JCjMhb6dKkhSD3welbLMqDJePwMlLjgGVpT2qTtnSlqZlRfiHmFLwW0KyoeR4qJUpLbHORlbTSjgf+VsPvKDiUspKlDqmhuXJ+HYfLSgVJJOj/I+KMX6Fkm+klhuTFr4mXHQomPJwUgncKO5ovvqorrzSJK0pc/An8vakxeHC1Li3SM5qTHXrUQe/cVf8cX1f8FAfOdThyhwHocU9E2unQ/EUkXO3PvNqKYUdOvmdnD4pK8ZRFOfGW6WOWmUyChRGwB3FP3iRtL1qctkZCUuSRpAA2T7mgj1UtammLNISxzQkhp9SR9oCetPJeyGGdcOd/TG4G7zXbBc1KE2EsqjLUdl74A99qawZgWNouTHWoh/LVjKjSC9WZbNt4nactWuNNbOoqScZHagGVcrlOK3JEyS7k5IU4SKDx7O0Os+q1as6Ru/FYkkpgILLWcKWo/cPY0u+LuNmYrzTMJfMcZOsqB2UT2pdyOILm+xyVu4RpCfl2OKqMkryrJPcmtHHTthyeTaqKDnh3idtiW9FkkqgSDqyo50LO5/5RFd7wzcOCp0DX/cxAXU7/iemKUmQVbZx4qQOuDOHFZIwd+o8GncVdkFmdas//9k=",
                     playtime: faker.number.int(100),
-                    played: faker.date.recent({days:10}).getTime(),
+                    played: faker.date.recent({days: 10}).getTime(),
                     description: "The upgraded prequel of NieR:Automata. A kind young man sets out with Grimoire Weiss, a strange talking book, to search for the &quot;Sealed verses&quot; in order to save his sister Yonah, who fell terminally ill to the Black Scrawl.",
                     genres: [
                       "Action",
@@ -1108,7 +1108,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAwUGBAL/xAAsEAACAgEDAwMDAwUAAAAAAAABAgMEBQAGERIhMSJBUQdhkRMUoRVDUnGz/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/xAAYEQEBAQEBAAAAAAAAAAAAAAABACERMf/aAAwDAQACEQMRAD8AsL+R3Jkd+5LEYnIrSr1Yo2QGFGDcqpJLEE88t4+2rbA08hXQDJ5N70jEDkxIgX/XSBzoWMxpr5vK3XPa08ZUD2CoF/PY6lZs7uaDaW9LmTr16NnHGT9nJGvVwvSCOxPq4DDhu3f21fcJ5a89nb8eKwVqKZ68mTtCoqxlAFLu3Qx6lbn0qPHzrNHlM5S3thcdcumercezDIpVCrGOIOGUhVIIblSD8ffSjIY3LZPZGzYzXS3LjpoLd4GRY1SJULBT1Hu3Qy/Y9/GqLH4dpc7jrP8ASWoVcfLI9UGRWLCVGMh4UkKvUV4HnudXCk+x+XisZ3IYz+9VCNz8hlB/jn+dSP1ZuGrs/dNeM8SW3pRIB5P6pCH/AJnXGWo7mxu/psvhKAvU7CKsimRF6V4UMOGYEN6fPfzphujZ1rPSLPDk7UD8wSiKZ+tVkicsvt7Bm4+CffUOCMYONyd/IboyG344QsVXJdVtyhCrVijjWNAf8pGX8Bu3fVVdz9SvuOhhnk5u3EeQIO5CgE8n8HSXBbZtbeny08Vy1dSy5siL9YiWWXjv1sex5+dI8Bh9yZL6hRbg3Jj4aaVYmihCOpBUhgPDE8+s8nto8Zt//9k=",
                         achieved: true,
-                        unlocked: faker.date.recent({days:10}).getTime(),
+                        unlocked: faker.date.recent({days: 10}).getTime(),
                         name: "e8 a8 98 e6 86 b6 e3 82 b5 e3 83 bc e3 83 90 e3 83 bc",
                         description: "",
                         id: "ACHIEVEMENT_0230",
@@ -1117,7 +1117,7 @@
                         icon:
                           "data:image/jpg;base64,/9j/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAgACADASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAABgQFBwP/xAAsEAACAQQBAwIFBAMAAAAAAAABAgMEBQYRABIhMSJBBxMUUaEVIzJhUnGC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAQAC/8QAGhEAAwEBAQEAAAAAAAAAAAAAAAERIUExMv/aAAwDAQACEQMRAD8AXZJe7vT5DVJLe1sVvR1hgeeCN4JGIH8pvV0MdghXC/0TxvY6S4UsJ/Urm9fIwBBMSIF/10gb5Gp7LG9wvclZFHPTXAorQyKHR0EYUgg+ffgDNbZk2BWSeuw27O1hh0Xt9SonajUt5iZgT0bIBU9wD7+z9Yi8HGaV60ENKTkMVmknf5MRljV1lc6+4Ovbv4G+/CtFeMnt3xHtljvVfFU09XHI5VIkA0EYqdgAhtr48a4dseE5ZltTb8lya4W2qi6FqKairY2eKRWXYUqmgi999tkHR0eaHHZK2qyS23m809ujq6cMiCjeR+gFWB6mYAMNHQAUd/f244sDWW1vu8VRfbhbN/vUoRt/cMoP43+eTLxQpdLPX2+TulVTyQn/AKUgfnXM9yCgyy3ZrV3fG6GOtiqIgvTI6BV9KgjTMp36B3/vifFbvks88aX/AB40miCZ4qiNl2D/AIhiRzM6hp0+Gc/1Hw7xqQb39BErb9mUdJ/IPJtZfqSmyKgszODW1aNIqDyFAJ2fsPSeVCxX+wYvFQ2e3U1wrIzN8tvniNEBlZkBDaJPSwHkDY88O4xaMpuWd02QZVb4KN6WBoUETp0nYYDQDMd+o8YnWV4f/9k=",
                         achieved: true,
-                        unlocked: faker.date.recent({days:10}).getTime(),
+                        unlocked: faker.date.recent({days: 10}).getTime(),
                         name: "Daredevil",
                         description: "",
                         id: "ACHIEVEMENT_0460",
@@ -1342,7 +1342,7 @@
                   contributionDays: new Array(7).fill(0).map(() => ({
                     contributionCount: faker.number.int(10),
                     color: faker.helpers.arrayElement(["#ebedf0", "#ebedf0", "#ebedf0", "#ebedf0", "#ebedf0", "#ebedf0", "#9be9a8", "#9be9a8", "#9be9a8", "#40c463", "#40c463", "#30a14e", "#216e39"]),
-                    date: faker.date.past({years:1}),
+                    date: faker.date.past({years: 1}),
                   })),
                 })),
               })),
diff --git a/tests/mocks/api/axios/get/lastfm.mjs b/tests/mocks/api/axios/get/lastfm.mjs
index ad301c6d5b1..0e864713858 100644
--- a/tests/mocks/api/axios/get/lastfm.mjs
+++ b/tests/mocks/api/axios/get/lastfm.mjs
@@ -33,19 +33,19 @@ export default function({faker, url, options, login = faker.internet.userName()}
                 image: [
                   {
                     size: "small",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                   {
                     size: "medium",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                   {
                     size: "large",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                   {
                     size: "extralarge",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                 ],
                 streamable: "0",
@@ -86,19 +86,19 @@ export default function({faker, url, options, login = faker.internet.userName()}
                 image: [
                   {
                     size: "small",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                   {
                     size: "medium",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                   {
                     size: "large",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                   {
                     size: "extralarge",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                 ],
                 url: faker.internet.url(),
@@ -130,19 +130,19 @@ export default function({faker, url, options, login = faker.internet.userName()}
                 image: [
                   {
                     size: "small",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                   {
                     size: "medium",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                   {
                     size: "large",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                   {
                     size: "extralarge",
-                    "#text": faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    "#text": faker.image.urlLoremFlickr({category: "abstract"}),
                   },
                 ],
                 streamable: "0",
diff --git a/tests/mocks/api/axios/get/spotify.mjs b/tests/mocks/api/axios/get/spotify.mjs
index 640726f1508..cf3fe687fda 100644
--- a/tests/mocks/api/axios/get/spotify.mjs
+++ b/tests/mocks/api/axios/get/spotify.mjs
@@ -24,17 +24,17 @@ export default function({faker, url, options, login = faker.internet.userName()}
                   images: [
                     {
                       height: 640,
-                      url: faker.image.urlLoremFlickr({ category: 'abstract' }),
+                      url: faker.image.urlLoremFlickr({category: "abstract"}),
                       width: 640,
                     },
                     {
                       height: 300,
-                      url: faker.image.urlLoremFlickr({ category: 'abstract' }),
+                      url: faker.image.urlLoremFlickr({category: "abstract"}),
                       width: 300,
                     },
                     {
                       height: 64,
-                      url: faker.image.urlLoremFlickr({ category: 'abstract' }),
+                      url: faker.image.urlLoremFlickr({category: "abstract"}),
                       width: 64,
                     },
                   ],
@@ -81,17 +81,17 @@ export default function({faker, url, options, login = faker.internet.userName()}
                 images: [
                   {
                     height: 640,
-                    url: faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    url: faker.image.urlLoremFlickr({category: "abstract"}),
                     width: 640,
                   },
                   {
                     height: 300,
-                    url: faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    url: faker.image.urlLoremFlickr({category: "abstract"}),
                     width: 300,
                   },
                   {
                     height: 64,
-                    url: faker.image.urlLoremFlickr({ category: 'abstract' }),
+                    url: faker.image.urlLoremFlickr({category: "abstract"}),
                     width: 64,
                   },
                 ],
@@ -126,17 +126,17 @@ export default function({faker, url, options, login = faker.internet.userName()}
               images: [
                 {
                   height: 640,
-                  url: faker.image.urlLoremFlickr({ category: 'abstract' }),
+                  url: faker.image.urlLoremFlickr({category: "abstract"}),
                   width: 640,
                 },
                 {
                   height: 300,
-                  url: faker.image.urlLoremFlickr({ category: 'abstract' }),
+                  url: faker.image.urlLoremFlickr({category: "abstract"}),
                   width: 300,
                 },
                 {
                   height: 64,
-                  url: faker.image.urlLoremFlickr({ category: 'abstract' }),
+                  url: faker.image.urlLoremFlickr({category: "abstract"}),
                   width: 64,
                 },
               ],
diff --git a/tests/mocks/api/axios/get/twitter.mjs b/tests/mocks/api/axios/get/twitter.mjs
index c23ccb544e1..761a3f96990 100644
--- a/tests/mocks/api/axios/get/twitter.mjs
+++ b/tests/mocks/api/axios/get/twitter.mjs
@@ -10,7 +10,7 @@ export default function({faker, url, options, login = faker.internet.userName()}
         status: 200,
         data: {
           data: {
-            profile_image_url: faker.image.urlLoremFlickr({ category: 'people' }),
+            profile_image_url: faker.image.urlLoremFlickr({category: "people"}),
             name: faker.person.fullName(),
             verified: faker.datatype.boolean(),
             id: faker.number.int(1000000).toString(),
diff --git a/tests/mocks/api/axios/post/anilist.mjs b/tests/mocks/api/axios/post/anilist.mjs
index fd9e725c330..59f9ba16505 100644
--- a/tests/mocks/api/axios/post/anilist.mjs
+++ b/tests/mocks/api/axios/post/anilist.mjs
@@ -15,7 +15,7 @@ export default function({faker, url, body, login = faker.internet.userName()}) {
       countryOfOrigin: "JP",
       genres: new Array(6).fill(null).map(_ => faker.lorem.word()),
       coverImage: {medium: null},
-      startDate: {year: faker.date.past({years:20}).getFullYear()},
+      startDate: {year: faker.date.past({years: 20}).getFullYear()},
     })
     //User statistics query
     if (/^query Statistics /.test(query)) {
diff --git a/tests/mocks/api/github/graphql/base.user.mjs b/tests/mocks/api/github/graphql/base.user.mjs
index fcc01f0c687..30456c8d8de 100644
--- a/tests/mocks/api/github/graphql/base.user.mjs
+++ b/tests/mocks/api/github/graphql/base.user.mjs
@@ -6,8 +6,8 @@ export default function({faker, query, login = faker.internet.userName()}) {
       databaseId: faker.number.int(10000000),
       name: faker.person.fullName(),
       login,
-      createdAt: `${faker.date.past({years:10})}`,
-      avatarUrl: faker.image.urlLoremFlickr({ category: 'people' }),
+      createdAt: `${faker.date.past({years: 10})}`,
+      avatarUrl: faker.image.urlLoremFlickr({category: "people"}),
       websiteUrl: faker.internet.url(),
       twitterUsername: login,
     },
diff --git a/tests/mocks/api/github/graphql/stargazers.default.mjs b/tests/mocks/api/github/graphql/stargazers.default.mjs
index d3a98f96255..aaebec76889 100644
--- a/tests/mocks/api/github/graphql/stargazers.default.mjs
+++ b/tests/mocks/api/github/graphql/stargazers.default.mjs
@@ -13,7 +13,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
       repository: {
         stargazers: {
           edges: new Array(faker.number.int({min: 50, max: 100})).fill(null).map(() => ({
-            starredAt: `${faker.date.recent({days:30})}`,
+            starredAt: `${faker.date.recent({days: 30})}`,
             cursor: "MOCKED_CURSOR",
             node: {
               location: faker.location.city(),
diff --git a/tests/mocks/api/github/graphql/stars.default.mjs b/tests/mocks/api/github/graphql/stars.default.mjs
index 4ee8e37db03..b929da11ac1 100644
--- a/tests/mocks/api/github/graphql/stars.default.mjs
+++ b/tests/mocks/api/github/graphql/stars.default.mjs
@@ -6,7 +6,7 @@ export default function({faker, query, login = faker.internet.userName()}) {
       starredRepositories: {
         edges: [
           {
-            starredAt: `${faker.date.recent({days:14})}`,
+            starredAt: `${faker.date.recent({days: 14})}`,
             node: {
               description: "📊 An image generator with 20+ metrics about your GitHub account such as activity, community, repositories, coding habits, website performances, music played, starred topics, etc. that you can put on your profile or elsewhere !",
               forkCount: faker.number.int(100),
diff --git a/tests/mocks/api/github/rest/activity/listEventsForAuthenticatedUser.mjs b/tests/mocks/api/github/rest/activity/listEventsForAuthenticatedUser.mjs
index add7f1dc5d8..5d8bab0b357 100644
--- a/tests/mocks/api/github/rest/activity/listEventsForAuthenticatedUser.mjs
+++ b/tests/mocks/api/github/rest/activity/listEventsForAuthenticatedUser.mjs
@@ -29,7 +29,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             body: faker.lorem.sentence(),
           },
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -58,7 +58,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             body: "",
           },
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -82,7 +82,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             performed_via_github_app: null,
           },
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -105,7 +105,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             },
           ],
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -138,7 +138,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             performed_via_github_app: null,
           },
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -156,7 +156,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             full_name: `${faker.lorem.word()}/${faker.lorem.word()}`,
           },
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -186,7 +186,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             },
           },
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -207,7 +207,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             prerelease: faker.datatype.boolean(),
           },
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -224,7 +224,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           ref_type: faker.helpers.arrayElement(["tag", "branch"]),
           master_branch: "master",
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -237,7 +237,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           name: "lowlighter/metrics",
         },
         payload: {action: "started"},
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -253,7 +253,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           ref: faker.lorem.slug(),
           ref_type: faker.helpers.arrayElement(["tag", "branch"]),
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -279,7 +279,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             },
           ],
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -305,7 +305,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
             changed_files: faker.number.int(10),
           },
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -323,7 +323,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           },
           action: "added",
         },
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
       {
@@ -336,7 +336,7 @@ export default async function({faker}, target, that, [{username: login, page, pe
           name: `${faker.lorem.word()}/${faker.lorem.word()}`,
         },
         payload: {},
-        created_at: faker.date.recent({days:7}),
+        created_at: faker.date.recent({days: 7}),
         public: true,
       },
     ],
diff --git a/tests/mocks/api/github/rest/repos/listCommits.mjs b/tests/mocks/api/github/rest/repos/listCommits.mjs
index 9523a89716e..7095e007c8f 100644
--- a/tests/mocks/api/github/rest/repos/listCommits.mjs
+++ b/tests/mocks/api/github/rest/repos/listCommits.mjs
@@ -21,13 +21,13 @@ export default async function({faker}, target, that, [{page, per_page, owner, re
             name: owner,
             login: faker.internet.userName(),
             avatar_url: null,
-            date: `${faker.date.recent({days:14})}`,
+            date: `${faker.date.recent({days: 14})}`,
           },
           committer: {
             name: owner,
             login: faker.internet.userName(),
             avatar_url: null,
-            date: `${faker.date.recent({days:14})}`,
+            date: `${faker.date.recent({days: 14})}`,
           },
         },
       }))
diff --git a/tests/mocks/api/github/rest/request.mjs b/tests/mocks/api/github/rest/request.mjs
index 83b1fb97d55..96ce51a594e 100644
--- a/tests/mocks/api/github/rest/request.mjs
+++ b/tests/mocks/api/github/rest/request.mjs
@@ -28,12 +28,12 @@ export default async function({faker}, target, that, args) {
           author: {
             name: faker.internet.userName(),
             email: faker.internet.email(),
-            date: `${faker.date.recent({days:7})}`,
+            date: `${faker.date.recent({days: 7})}`,
           },
           committer: {
             name: faker.internet.userName(),
             email: faker.internet.email(),
-            date: `${faker.date.recent({days:7})}`,
+            date: `${faker.date.recent({days: 7})}`,
           },
           url: "https://api.github.com/repos/lowlighter/metrics/commits/MOCKED_SHA",
         },
diff --git a/tests/mocks/index.mjs b/tests/mocks/index.mjs
index 27c68db6778..e470dc51614 100644
--- a/tests/mocks/index.mjs
+++ b/tests/mocks/index.mjs
@@ -73,17 +73,17 @@ export default async function({graphql, rest}) {
           return new Proxy(target[section], {
             get(target, property) {
               if (mocks.github.rest?.[section]?.[property]) {
-                return async function () {
+                return async function() {
                   console.debug(`metrics/mocking > rest.${section}.${property}`)
                   return mocks.github.rest[section][property]({faker}, target, null, arguments)
                 }
               }
               return Reflect.get(target, property)
-            }
+            },
           })
         }
         return Reflect.get(target, section)
-      }
+      },
     })
   }
 

From 372e08b0e43ad06c8e10acc07c4282ea6efb57d9 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 24 Aug 2023 22:34:58 +0000
Subject: [PATCH 153/196] ci: auto-regenerate files

---
 source/plugins/achievements/README.md         | 21 ++--
 source/plugins/activity/README.md             | 23 +++--
 source/plugins/anilist/README.md              | 19 ++--
 source/plugins/base/README.md                 | 27 +++--
 source/plugins/calendar/README.md             |  6 +-
 source/plugins/code/README.md                 | 19 ++--
 .../community/16personalities/README.md       | 12 ++-
 source/plugins/community/chess/README.md      | 11 ++-
 source/plugins/community/fortune/README.md    |  3 +-
 source/plugins/community/nightscout/README.md | 21 ++--
 source/plugins/community/poopmap/README.md    |  7 +-
 source/plugins/community/screenshot/README.md | 24 +++--
 source/plugins/community/splatoon/README.md   | 18 +++-
 source/plugins/community/stock/README.md      | 13 ++-
 source/plugins/contributors/README.md         | 19 ++--
 source/plugins/core/README.md                 | 98 ++++++++++++++-----
 source/plugins/discussions/README.md          |  9 +-
 source/plugins/followup/README.md             | 12 ++-
 source/plugins/gists/README.md                |  3 +-
 source/plugins/habits/README.md               | 28 ++++--
 source/plugins/introduction/README.md         |  6 +-
 source/plugins/isocalendar/README.md          |  6 +-
 source/plugins/languages/README.md            | 52 ++++++----
 source/plugins/leetcode/README.md             | 16 ++-
 source/plugins/licenses/README.md             | 12 ++-
 source/plugins/lines/README.md                | 13 ++-
 source/plugins/music/README.md                | 24 +++--
 source/plugins/notable/README.md              | 22 +++--
 source/plugins/pagespeed/README.md            | 14 ++-
 source/plugins/people/README.md               | 23 +++--
 source/plugins/posts/README.md                | 16 ++-
 source/plugins/projects/README.md             | 10 +-
 source/plugins/reactions/README.md            | 25 +++--
 source/plugins/repositories/README.md         | 22 +++--
 source/plugins/rss/README.md                  |  9 +-
 source/plugins/skyline/README.md              | 18 ++--
 source/plugins/sponsors/README.md             | 15 ++-
 source/plugins/sponsorships/README.md         |  9 +-
 source/plugins/stackoverflow/README.md        | 16 ++-
 source/plugins/stargazers/README.md           | 19 ++--
 source/plugins/starlists/README.md            | 30 ++++--
 source/plugins/stars/README.md                |  6 +-
 source/plugins/steam/README.md                | 23 +++--
 source/plugins/support/README.md              |  3 +-
 source/plugins/topics/README.md               | 12 ++-
 source/plugins/traffic/README.md              |  4 +-
 source/plugins/tweets/README.md               | 11 ++-
 source/plugins/wakatime/README.md             | 26 +++--
 48 files changed, 592 insertions(+), 263 deletions(-)

diff --git a/source/plugins/achievements/README.md b/source/plugins/achievements/README.md
index 8683ac4353d..8b39e21f2de 100644
--- a/source/plugins/achievements/README.md
+++ b/source/plugins/achievements/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -55,7 +56,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> C<br>
 <b>allowed values:</b><ul><li>S</li><li>A</li><li>B</li><li>C</li><li>X</li></ul></td>
@@ -66,7 +68,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -80,7 +83,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> detailed<br>
 <b>allowed values:</b><ul><li>detailed</li><li>compact</li></ul></td>
@@ -91,7 +95,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -105,7 +110,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -117,7 +123,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
diff --git a/source/plugins/activity/README.md b/source/plugins/activity/README.md
index c94f9acc788..40a41042b31 100644
--- a/source/plugins/activity/README.md
+++ b/source/plugins/activity/README.md
@@ -39,7 +39,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -49,7 +50,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 1000)</i>
@@ -62,7 +64,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(100 ≤
 𝑥
 ≤ 1000)</i>
@@ -75,7 +78,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 365)</i>
@@ -90,7 +94,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> all<br>
 <b>allowed values:</b><ul><li>public</li><li>all</li></ul></td>
@@ -101,7 +106,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -112,6 +118,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -124,6 +131,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>users_ignored</code><br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -150,7 +158,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> all<br>
diff --git a/source/plugins/anilist/README.md b/source/plugins/anilist/README.md
index d86f7c16306..74a354b269e 100644
--- a/source/plugins/anilist/README.md
+++ b/source/plugins/anilist/README.md
@@ -41,7 +41,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -56,6 +57,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User login</code><br></td>
@@ -66,7 +68,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> anime, manga<br>
@@ -84,7 +87,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> favorites<br>
@@ -96,7 +100,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -109,7 +114,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -123,7 +129,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/base/README.md b/source/plugins/base/README.md
index e797cbffd49..28e8d34a944 100644
--- a/source/plugins/base/README.md
+++ b/source/plugins/base/README.md
@@ -48,7 +48,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> header, activity, community, repositories, metadata<br>
@@ -69,7 +70,8 @@ This currently improves the accuracy of the following statistics:</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.github.overuse</i></li>
 </ul>
@@ -83,7 +85,8 @@ This currently improves the accuracy of the following statistics:</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -97,7 +100,8 @@ Only use this option when using a plugin that can be configured with <a href="/s
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -108,7 +112,8 @@ Only use this option when using a plugin that can be configured with <a href="/s
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -122,7 +127,8 @@ This setting may not be supported by all plugins.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 100)</i>
@@ -135,7 +141,8 @@ This setting may not be supported by all plugins.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -153,7 +160,8 @@ Broad affiliations will result in less representative metrics.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> owner<br>
@@ -166,6 +174,7 @@ Broad affiliations will result in less representative metrics.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -178,6 +187,7 @@ Broad affiliations will result in less representative metrics.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
@@ -192,6 +202,7 @@ Broad affiliations will result in less representative metrics.</p>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
 ⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
diff --git a/source/plugins/calendar/README.md b/source/plugins/calendar/README.md
index 178a91b4f6c..c8a3c6a36cd 100644
--- a/source/plugins/calendar/README.md
+++ b/source/plugins/calendar/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -59,7 +60,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <br>
 <b>zero behaviour:</b> disable</br>
 <b>default:</b> 1<br></td>
diff --git a/source/plugins/code/README.md b/source/plugins/code/README.md
index e0910140684..afb90c44a0c 100644
--- a/source/plugins/code/README.md
+++ b/source/plugins/code/README.md
@@ -45,7 +45,8 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -55,7 +56,8 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 128)</i>
@@ -68,7 +70,8 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(100 ≤
 𝑥
 ≤ 1000)</i>
@@ -81,7 +84,8 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 365)</i>
@@ -96,7 +100,8 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> public<br>
 <b>allowed values:</b><ul><li>public</li><li>all</li></ul></td>
@@ -108,6 +113,7 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -118,7 +124,8 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
diff --git a/source/plugins/community/16personalities/README.md b/source/plugins/community/16personalities/README.md
index 50b64edd85d..734953cc1a8 100644
--- a/source/plugins/community/16personalities/README.md
+++ b/source/plugins/community/16personalities/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -57,7 +58,8 @@ Login with the generated password received in your mailbox and copy the link tha
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -71,7 +73,8 @@ Login with the generated password received in your mailbox and copy the link tha
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> personality<br>
@@ -83,7 +86,8 @@ Login with the generated password received in your mailbox and copy the link tha
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/community/chess/README.md b/source/plugins/community/chess/README.md
index fddbc6c3e12..b87742ce0af 100644
--- a/source/plugins/community/chess/README.md
+++ b/source/plugins/community/chess/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,6 +52,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.chess.any</i></li>
@@ -65,6 +67,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User login</code><br></td>
@@ -75,7 +78,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>allowed values:</b><ul><li>lichess.org</li></ul></td>
   </tr>
@@ -90,7 +94,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>json</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>json</code>
 <br>
 <b>default:</b> <details><summary>→ Click to expand</summary><pre language="json"><code>{
   "size": 40,
diff --git a/source/plugins/community/fortune/README.md b/source/plugins/community/fortune/README.md
index 90a342ff25f..025e2500a90 100644
--- a/source/plugins/community/fortune/README.md
+++ b/source/plugins/community/fortune/README.md
@@ -37,7 +37,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/community/nightscout/README.md b/source/plugins/community/nightscout/README.md
index 0f20def1cb3..25e041f4cca 100644
--- a/source/plugins/community/nightscout/README.md
+++ b/source/plugins/community/nightscout/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -50,7 +51,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> https://example.herokuapp.com<br></td>
   </tr>
@@ -60,7 +62,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -73,7 +76,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -85,7 +89,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -97,7 +102,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -109,7 +115,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
diff --git a/source/plugins/community/poopmap/README.md b/source/plugins/community/poopmap/README.md
index c6dc714305d..fe905b31d8c 100644
--- a/source/plugins/community/poopmap/README.md
+++ b/source/plugins/community/poopmap/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,6 +52,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -60,7 +62,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <br>
 <b>default:</b> 7<br>
 <b>allowed values:</b><ul><li>7</li><li>30</li><li>180</li><li>365</li></ul></td>
diff --git a/source/plugins/community/screenshot/README.md b/source/plugins/community/screenshot/README.md
index cf02e99a35c..e6b14c726ad 100644
--- a/source/plugins/community/screenshot/README.md
+++ b/source/plugins/community/screenshot/README.md
@@ -38,7 +38,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -52,7 +53,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> Screenshot<br></td>
   </tr>
@@ -62,7 +64,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -71,7 +74,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> body<br></td>
   </tr>
@@ -88,7 +92,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> image<br>
 <b>allowed values:</b><ul><li>image</li><li>text</li></ul></td>
@@ -99,7 +104,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>json</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>json</code>
 <br>
 <b>default:</b> <details><summary>→ Click to expand</summary><pre language="json"><code>{
   "width": 1280,
@@ -113,7 +119,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -125,7 +132,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/community/splatoon/README.md b/source/plugins/community/splatoon/README.md
index 99e2efaccd8..13e894065fd 100644
--- a/source/plugins/community/splatoon/README.md
+++ b/source/plugins/community/splatoon/README.md
@@ -42,7 +42,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -53,6 +54,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.nintendo.splatnet</i></li>
@@ -71,7 +73,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> player, versus, salmon-run<br></td>
@@ -82,7 +85,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 6)</i>
@@ -95,7 +99,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 6)</i>
@@ -110,7 +115,8 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.statink</i></li>
 </ul>
@@ -125,6 +131,7 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -141,6 +148,7 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> splatnet<br>
diff --git a/source/plugins/community/stock/README.md b/source/plugins/community/stock/README.md
index 1a4f5953c04..deb18ed9b55 100644
--- a/source/plugins/community/stock/README.md
+++ b/source/plugins/community/stock/README.md
@@ -37,7 +37,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.npm.optional.d3</i></li>
 <li><i>metrics.api.yahoo.finance</i></li>
@@ -53,6 +54,7 @@
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -62,7 +64,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -85,7 +88,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 1d<br>
 <b>allowed values:</b><ul><li>1d</li><li>5d</li><li>1mo</li><li>3mo</li><li>6mo</li><li>1y</li><li>2y</li><li>5y</li><li>10y</li><li>ytd</li><li>max</li></ul></td>
@@ -104,7 +108,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 5m<br>
 <b>allowed values:</b><ul><li>1m</li><li>2m</li><li>5m</li><li>15m</li><li>60m</li><li>1d</li></ul></td>
diff --git a/source/plugins/contributors/README.md b/source/plugins/contributors/README.md
index f32bf23423b..58ed6e612d8 100644
--- a/source/plugins/contributors/README.md
+++ b/source/plugins/contributors/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,7 +52,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -61,7 +63,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> master<br></td>
   </tr>
@@ -73,6 +76,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>users_ignored</code><br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -83,7 +87,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -97,7 +102,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> contributors<br>
@@ -111,7 +117,8 @@ Pass a JSON object mapping category with file globs</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.tempdir</i></li>
 <li><i>metrics.run.git</i></li>
diff --git a/source/plugins/core/README.md b/source/plugins/core/README.md
index 518a3f3bdf3..7b2625e75f8 100644
--- a/source/plugins/core/README.md
+++ b/source/plugins/core/README.md
@@ -468,6 +468,7 @@ When doing so, any settings which defaults on user fetched values will not be te
   <tr>
     <td nowrap="nowrap">✔️ Required<br>
 🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -479,6 +480,7 @@ When doing so, any settings which defaults on user fetched values will not be te
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -490,6 +492,7 @@ When doing so, any settings which defaults on user fetched values will not be te
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -504,6 +507,7 @@ When doing so, any settings which defaults on user fetched values will not be te
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br>
 <b>default:</b> ${{ github.token }}<br></td>
@@ -515,7 +519,8 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -525,7 +530,8 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> Update ${filename} - [Skip GitHub Action]<br></td>
   </tr>
@@ -537,6 +543,7 @@ When doing so, any settings which defaults on user fetched values will not be te
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -547,7 +554,8 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> github-metrics.*<br></td>
   </tr>
@@ -558,7 +566,8 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> TEMPLATE.md<br></td>
   </tr>
@@ -568,7 +577,8 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> .cache<br></td>
   </tr>
@@ -593,7 +603,8 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> commit<br>
 <b>allowed values:</b><ul><li>none</li><li>commit</li><li>pull-request</li><li>pull-request-merge</li><li>pull-request-squash</li><li>pull-request-rebase</li><li>gist</li></ul></td>
@@ -611,7 +622,8 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> always<br>
 <b>allowed values:</b><ul><li>always</li><li>data-changed</li></ul></td>
@@ -628,7 +640,8 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> css, xml<br>
@@ -641,7 +654,8 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.setup.community.templates</i></li>
 </ul>
@@ -657,7 +671,8 @@ See <a href="https://github.com/lowlighter/metrics/blob/master/README.md#%EF%B8%
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> classic<br></td>
   </tr>
@@ -672,7 +687,8 @@ This is mostly useful for custom templates.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>json</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>json</code>
 <br>
 <b>default:</b> <details><summary>→ Click to expand</summary><pre language="json"><code>{}</code></pre></details><br></td>
   </tr>
@@ -687,7 +703,8 @@ Useful to avoid creating a new template just to tweak some styling</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.user.css</i></li>
 </ul>
@@ -707,7 +724,8 @@ It is run after transformations and optimizations, but just before resizing.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.user.js</i></li>
 </ul>
@@ -723,6 +741,7 @@ Leave empty to use default endpoint.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -738,6 +757,7 @@ Leave empty to use default endpoint.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -749,6 +769,7 @@ Leave empty to use default endpoint.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -762,6 +783,7 @@ You can override the content order by using this setting.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -775,6 +797,7 @@ May increase filesize.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -790,6 +813,7 @@ See full list at <a href="https://api.github.com/emojis">https://api.github.com/
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
@@ -807,6 +831,7 @@ Size must be a supported icon size (12, 16 or 24).
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -826,6 +851,7 @@ Size must be a supported icon size (12, 16 or 24).
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> regular<br>
@@ -838,6 +864,7 @@ Size must be a supported icon size (12, 16 or 24).
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
@@ -850,6 +877,7 @@ Size must be a supported icon size (12, 16 or 24).
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
@@ -874,7 +902,8 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 0, 8 + 11%<br></td>
   </tr>
@@ -894,7 +923,8 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> auto<br>
 <b>allowed values:</b><ul><li>auto</li><li>svg</li><li>png</li><li>jpeg</li><li>json</li><li>markdown</li><li>markdown-pdf</li><li>insights</li></ul></td>
@@ -906,6 +936,7 @@ It can result in cropped or oversized outputs.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.setup.community.presets</i></li>
@@ -920,7 +951,8 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 10)</i>
@@ -933,7 +965,8 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 3600)</i>
@@ -946,7 +979,8 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 10)</i>
@@ -959,7 +993,8 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 3600)</i>
@@ -979,6 +1014,7 @@ Be sure to disable this option when asking for help or submitting bug reports.</
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
@@ -991,7 +1027,8 @@ Be sure to disable this option when asking for help or submitting bug reports.</
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 3600)</i>
@@ -1006,7 +1043,8 @@ Be sure to disable this option when asking for help or submitting bug reports.</
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 5000)</i>
@@ -1021,7 +1059,8 @@ Be sure to disable this option when asking for help or submitting bug reports.</
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 5000)</i>
@@ -1036,7 +1075,8 @@ Be sure to disable this option when asking for help or submitting bug reports.</
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 30)</i>
@@ -1049,7 +1089,8 @@ Be sure to disable this option when asking for help or submitting bug reports.</
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -1063,6 +1104,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
@@ -1076,6 +1118,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -1089,6 +1132,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -1101,6 +1145,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
+✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.npm.optional.libxml2</i></li>
@@ -1135,6 +1180,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(space-separated)</i>
 <br>
@@ -1148,6 +1194,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -1163,6 +1210,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -1178,6 +1226,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(space-separated)</i>
 <br>
@@ -1191,6 +1240,7 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
diff --git a/source/plugins/discussions/README.md b/source/plugins/discussions/README.md
index db25d2a82ab..69568a4b726 100644
--- a/source/plugins/discussions/README.md
+++ b/source/plugins/discussions/README.md
@@ -39,7 +39,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -49,7 +50,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -60,7 +62,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <br>
 <b>zero behaviour:</b> disable</br>
 <b>default:</b> 0<br></td>
diff --git a/source/plugins/followup/README.md b/source/plugins/followup/README.md
index db00e7a9dba..2615d217b8c 100644
--- a/source/plugins/followup/README.md
+++ b/source/plugins/followup/README.md
@@ -41,7 +41,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -55,7 +56,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> repositories<br>
@@ -67,7 +69,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.github.overuse</i></li>
 </ul>
@@ -81,7 +84,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/gists/README.md b/source/plugins/gists/README.md
index 572ba235f3a..91beea168d7 100644
--- a/source/plugins/gists/README.md
+++ b/source/plugins/gists/README.md
@@ -39,7 +39,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/habits/README.md b/source/plugins/habits/README.md
index 93ee388e79e..5e6d92e5128 100644
--- a/source/plugins/habits/README.md
+++ b/source/plugins/habits/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,7 +52,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 1000)</i>
@@ -65,6 +67,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -75,7 +78,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 30)</i>
@@ -89,7 +93,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -101,7 +106,8 @@ Recent language activity may also displayed (it requires extras features to be e
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.github.overuse</i></li>
 <li><i>metrics.run.tempdir</i></li>
@@ -124,7 +130,8 @@ Recent language activity may also displayed (it requires extras features to be e
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.npm.optional.d3</i></li>
 </ul>
@@ -139,7 +146,8 @@ Recent language activity may also displayed (it requires extras features to be e
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -149,7 +157,8 @@ Recent language activity may also displayed (it requires extras features to be e
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 8)</i>
@@ -163,7 +172,8 @@ Recent language activity may also displayed (it requires extras features to be e
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 0%<br></td>
   </tr>
diff --git a/source/plugins/introduction/README.md b/source/plugins/introduction/README.md
index ff20b97cf6e..765a015c056 100644
--- a/source/plugins/introduction/README.md
+++ b/source/plugins/introduction/README.md
@@ -41,7 +41,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,7 +52,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/isocalendar/README.md b/source/plugins/isocalendar/README.md
index 0dcab7a34e0..7dd5faecf1e 100644
--- a/source/plugins/isocalendar/README.md
+++ b/source/plugins/isocalendar/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -54,7 +55,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> half-year<br>
 <b>allowed values:</b><ul><li>half-year</li><li>full-year</li></ul></td>
diff --git a/source/plugins/languages/README.md b/source/plugins/languages/README.md
index ca77c7af764..e6a8ab6e139 100644
--- a/source/plugins/languages/README.md
+++ b/source/plugins/languages/README.md
@@ -42,7 +42,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,7 +53,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -63,6 +65,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -73,7 +76,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 8)</i>
@@ -87,7 +91,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 0%<br></td>
   </tr>
@@ -99,7 +104,8 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -109,7 +115,8 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> github<br></td>
@@ -120,7 +127,8 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -130,7 +138,8 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> most-used<br>
@@ -143,7 +152,8 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>allowed values:</b><ul><li>bytes-size</li><li>percentage</li><li>lines</li></ul></td>
@@ -157,7 +167,8 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.cpu.overuse</i></li>
 <li><i>metrics.run.tempdir</i></li>
@@ -188,7 +199,8 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -198,7 +210,8 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 60)</i>
@@ -211,7 +224,8 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 15)</i>
@@ -225,7 +239,8 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> markup, programming<br>
@@ -237,7 +252,8 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> markup, programming<br>
@@ -249,7 +265,8 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(100 ≤
 𝑥
 ≤ 1000)</i>
@@ -262,7 +279,8 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 365)</i>
diff --git a/source/plugins/leetcode/README.md b/source/plugins/leetcode/README.md
index 896b56ed086..754503c3f01 100644
--- a/source/plugins/leetcode/README.md
+++ b/source/plugins/leetcode/README.md
@@ -39,7 +39,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -50,6 +51,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User login</code><br></td>
@@ -65,7 +67,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> solved<br>
@@ -77,7 +80,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -91,7 +95,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <br></td>
   </tr>
   <tr>
@@ -100,7 +105,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 15)</i>
diff --git a/source/plugins/licenses/README.md b/source/plugins/licenses/README.md
index 723148978d1..ffe034c91ce 100644
--- a/source/plugins/licenses/README.md
+++ b/source/plugins/licenses/README.md
@@ -69,7 +69,8 @@ Dependencies will be analyzed by [GitHub licensed](https://github.com/github/lic
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.cpu.overuse</i></li>
 <li><i>metrics.run.tempdir</i></li>
@@ -91,7 +92,8 @@ The example command is intended for NodeJs projects that use <code>npm</code> to
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -100,7 +102,8 @@ The example command is intended for NodeJs projects that use <code>npm</code> to
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -110,7 +113,8 @@ The example command is intended for NodeJs projects that use <code>npm</code> to
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/lines/README.md b/source/plugins/lines/README.md
index 1271e38e4e7..3375b4e3ebc 100644
--- a/source/plugins/lines/README.md
+++ b/source/plugins/lines/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,6 +52,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -69,7 +71,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> base<br>
@@ -81,7 +84,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -94,7 +98,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <br>
 <b>zero behaviour:</b> disable</br>
 <b>default:</b> 1<br></td>
diff --git a/source/plugins/music/README.md b/source/plugins/music/README.md
index 35b8963c07d..562bafc5218 100644
--- a/source/plugins/music/README.md
+++ b/source/plugins/music/README.md
@@ -41,7 +41,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -62,7 +63,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>allowed values:</b><ul><li>apple</li><li>spotify</li><li>lastfm</li><li>youtube</li></ul></td>
   </tr>
@@ -80,6 +82,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.music.any</i></li>
@@ -94,6 +97,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User login</code><br></td>
@@ -110,7 +114,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>allowed values:</b><ul><li>playlist</li><li>recent</li><li>top</li></ul></td>
   </tr>
@@ -122,6 +127,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -131,7 +137,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 100)</i>
@@ -144,7 +151,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -159,7 +167,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> short<br>
 <b>allowed values:</b><ul><li>short</li><li>medium</li><li>long</li></ul></td>
@@ -174,7 +183,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> tracks<br>
 <b>allowed values:</b><ul><li>tracks</li><li>artists</li></ul></td>
diff --git a/source/plugins/notable/README.md b/source/plugins/notable/README.md
index c57c48c2f4e..8fde7d1fc8c 100644
--- a/source/plugins/notable/README.md
+++ b/source/plugins/notable/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -54,7 +55,8 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -64,6 +66,7 @@ Some repositories may not be able to reported advanced stats and in the case the
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -79,7 +82,8 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> organization<br>
 <b>allowed values:</b><ul><li>all</li><li>organization</li><li>user</li></ul></td>
@@ -91,7 +95,8 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -101,7 +106,8 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.github.overuse</i></li>
 </ul>
@@ -121,7 +127,8 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> commit<br>
@@ -133,7 +140,8 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/pagespeed/README.md b/source/plugins/pagespeed/README.md
index ef1e08aa2ae..402690a0c38 100644
--- a/source/plugins/pagespeed/README.md
+++ b/source/plugins/pagespeed/README.md
@@ -42,7 +42,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -56,6 +57,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.google.pagespeed</i></li>
@@ -70,6 +72,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User attached website</code><br></td>
@@ -89,7 +92,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -100,7 +104,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -110,7 +115,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/people/README.md b/source/plugins/people/README.md
index a3c8b89810a..a1a8a63f27e 100644
--- a/source/plugins/people/README.md
+++ b/source/plugins/people/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -50,7 +51,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -64,7 +66,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -76,7 +79,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -86,7 +90,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(8 ≤
 𝑥
 ≤ 64)</i>
@@ -117,7 +122,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> followers, following<br>
@@ -131,6 +137,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -144,6 +151,7 @@ The option <a href="/source/plugins/people/README.md#plugin_people_types"><code>
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -156,7 +164,8 @@ This will fetch additional data (10 times <a href="/source/plugins/people/README
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/posts/README.md b/source/plugins/posts/README.md
index 4054213aff6..10e7fa36a4a 100644
--- a/source/plugins/posts/README.md
+++ b/source/plugins/posts/README.md
@@ -37,7 +37,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,7 +52,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>allowed values:</b><ul><li>dev.to</li><li>hashnode</li></ul></td>
   </tr>
@@ -62,6 +64,7 @@
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User login</code><br></td>
@@ -72,7 +75,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -82,7 +86,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -92,7 +97,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 30)</i>
diff --git a/source/plugins/projects/README.md b/source/plugins/projects/README.md
index 21eea26d74c..e926ca29255 100644
--- a/source/plugins/projects/README.md
+++ b/source/plugins/projects/README.md
@@ -39,7 +39,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -50,7 +51,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 100)</i>
@@ -68,6 +70,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -78,7 +81,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/reactions/README.md b/source/plugins/reactions/README.md
index e1e0973daec..4953d04feae 100644
--- a/source/plugins/reactions/README.md
+++ b/source/plugins/reactions/README.md
@@ -39,7 +39,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -49,7 +50,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 1000)</i>
@@ -62,7 +64,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 1000)</i>
@@ -75,7 +78,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 1000)</i>
@@ -88,7 +92,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 1000)</i>
@@ -101,7 +106,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -118,7 +124,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> absolute<br>
 <b>allowed values:</b><ul><li>absolute</li><li>relative</li></ul></td>
@@ -129,7 +136,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>allowed values:</b><ul><li>count</li><li>percentage</li></ul></td>
@@ -142,6 +150,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>users_ignored</code><br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
diff --git a/source/plugins/repositories/README.md b/source/plugins/repositories/README.md
index 935dd7c0052..2da30188f9e 100644
--- a/source/plugins/repositories/README.md
+++ b/source/plugins/repositories/README.md
@@ -45,7 +45,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -57,6 +58,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -67,7 +69,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 6)</i>
@@ -80,7 +83,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 100)</i>
@@ -93,7 +97,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 100)</i>
@@ -106,7 +111,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <br>
 <b>default:</b> featured, pinned, starred, random<br>
 <b>allowed values:</b><ul><li>featured</li><li>pinned</li><li>starred</li><li>random</li></ul></td>
@@ -117,7 +123,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -134,7 +141,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> owner<br>
diff --git a/source/plugins/rss/README.md b/source/plugins/rss/README.md
index 75290cc39fc..e7834337dfe 100644
--- a/source/plugins/rss/README.md
+++ b/source/plugins/rss/README.md
@@ -36,7 +36,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -46,7 +47,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -55,7 +57,8 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 30)</i>
diff --git a/source/plugins/skyline/README.md b/source/plugins/skyline/README.md
index ead7fb0d4ef..902f21f66d2 100644
--- a/source/plugins/skyline/README.md
+++ b/source/plugins/skyline/README.md
@@ -44,7 +44,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.cpu.overuse</i></li>
 <li><i>metrics.npm.optional.gifencoder</i></li>
@@ -60,7 +61,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(2008 ≤
 𝑥)</i>
 <br>
@@ -74,7 +76,8 @@ A higher number of frames will increase file size.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 120)</i>
@@ -88,7 +91,8 @@ A higher number of frames will increase file size.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0.1 ≤
 𝑥
 ≤ 1)</i>
@@ -103,7 +107,8 @@ Using this mode significantly increase file size as each frame is encoded separa
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -121,7 +126,8 @@ Using this mode significantly increase file size as each frame is encoded separa
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.user.js</i></li>
 </ul>
diff --git a/source/plugins/sponsors/README.md b/source/plugins/sponsors/README.md
index 76c4071e0a7..021516d2dcb 100644
--- a/source/plugins/sponsors/README.md
+++ b/source/plugins/sponsors/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -55,7 +56,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> goal, list, about<br>
@@ -71,7 +73,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -81,7 +84,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(8 ≤
 𝑥
 ≤ 64)</i>
@@ -94,7 +98,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> Sponsor Me!<br></td>
   </tr>
diff --git a/source/plugins/sponsorships/README.md b/source/plugins/sponsorships/README.md
index 068b30b388f..d23645a7149 100644
--- a/source/plugins/sponsorships/README.md
+++ b/source/plugins/sponsorships/README.md
@@ -39,7 +39,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -53,7 +54,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> amount, sponsorships<br>
@@ -65,7 +67,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(8 ≤
 𝑥
 ≤ 64)</i>
diff --git a/source/plugins/stackoverflow/README.md b/source/plugins/stackoverflow/README.md
index 66e89b8cbb2..e4ebd3e1183 100644
--- a/source/plugins/stackoverflow/README.md
+++ b/source/plugins/stackoverflow/README.md
@@ -39,7 +39,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -50,6 +51,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>number</code>
 <br>
 <b>default:</b> 0<br></td>
@@ -66,7 +68,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> answers-top, questions-recent<br>
@@ -78,7 +81,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 30)</i>
@@ -92,7 +96,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -105,7 +110,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
diff --git a/source/plugins/stargazers/README.md b/source/plugins/stargazers/README.md
index a554e60aecf..e920e0b844d 100644
--- a/source/plugins/stargazers/README.md
+++ b/source/plugins/stargazers/README.md
@@ -52,7 +52,8 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -63,7 +64,8 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -77,7 +79,8 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -94,7 +97,8 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.npm.optional.d3</i></li>
 </ul>
@@ -109,7 +113,8 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.google.maps</i></li>
 <li><i>metrics.npm.optional.d3</i></li>
@@ -125,6 +130,7 @@ Follow instructions from their [documentation](https://developers.google.com/map
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -136,7 +142,8 @@ Helps to avoid consuming too much Google Geocoding API requests while still bein
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
diff --git a/source/plugins/starlists/README.md b/source/plugins/starlists/README.md
index a821c9c01cf..6433f75b33b 100644
--- a/source/plugins/starlists/README.md
+++ b/source/plugins/starlists/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -54,7 +55,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 100)</i>
@@ -67,7 +69,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 100)</i>
@@ -80,7 +83,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -90,7 +94,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -103,7 +108,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -113,7 +119,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -123,7 +130,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -134,7 +142,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -146,7 +155,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
diff --git a/source/plugins/stars/README.md b/source/plugins/stars/README.md
index 2941d8c6c00..f171ece827b 100644
--- a/source/plugins/stars/README.md
+++ b/source/plugins/stars/README.md
@@ -39,7 +39,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -49,7 +50,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 100)</i>
diff --git a/source/plugins/steam/README.md b/source/plugins/steam/README.md
index 32b33db0e40..676dc324e93 100644
--- a/source/plugins/steam/README.md
+++ b/source/plugins/steam/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,6 +52,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.steam</i></li>
@@ -69,7 +71,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> player, most-played, recently-played<br></td>
@@ -82,6 +85,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -92,7 +96,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -102,7 +107,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -115,7 +121,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -128,7 +135,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -140,7 +148,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
diff --git a/source/plugins/support/README.md b/source/plugins/support/README.md
index 48f75ac8dbf..2bb70ac5781 100644
--- a/source/plugins/support/README.md
+++ b/source/plugins/support/README.md
@@ -41,7 +41,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
diff --git a/source/plugins/topics/README.md b/source/plugins/topics/README.md
index 946cee8f25c..9e582909341 100644
--- a/source/plugins/topics/README.md
+++ b/source/plugins/topics/README.md
@@ -41,7 +41,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -61,7 +62,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> starred<br>
 <b>allowed values:</b><ul><li>labels</li><li>icons</li><li>starred</li><li>mastered</li></ul></td>
@@ -78,7 +80,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> stars<br>
 <b>allowed values:</b><ul><li>stars</li><li>activity</li><li>starred</li><li>random</li></ul></td>
@@ -89,7 +92,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 20)</i>
diff --git a/source/plugins/traffic/README.md b/source/plugins/traffic/README.md
index 524a75791c6..6c4fd2f9d27 100644
--- a/source/plugins/traffic/README.md
+++ b/source/plugins/traffic/README.md
@@ -39,7 +39,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -50,6 +51,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
diff --git a/source/plugins/tweets/README.md b/source/plugins/tweets/README.md
index c1e903cdf85..cb8745f8da0 100644
--- a/source/plugins/tweets/README.md
+++ b/source/plugins/tweets/README.md
@@ -42,7 +42,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.twitter.tweets</i></li>
 </ul>
@@ -57,6 +58,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -67,6 +69,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User attached twitter</code><br></td>
@@ -78,7 +81,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -88,7 +92,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 10)</i>
diff --git a/source/plugins/wakatime/README.md b/source/plugins/wakatime/README.md
index 5b5d02fcf19..57f7c9910c8 100644
--- a/source/plugins/wakatime/README.md
+++ b/source/plugins/wakatime/README.md
@@ -40,7 +40,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,6 +52,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -61,7 +63,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> https://wakatime.com<br></td>
   </tr>
@@ -72,6 +75,7 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
+✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> current<br></td>
@@ -93,7 +97,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <br>
 <b>default:</b> time, projects, projects-graphs, languages, languages-graphs, editors, os<br>
 <b>allowed values:</b><ul><li>time</li><li>projects</li><li>projects-graphs</li><li>languages</li><li>languages-graphs</li><li>editors</li><li>editors-graphs</li><li>os</li><li>os-graphs</li></ul></td>
@@ -104,7 +109,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 7<br>
 <b>allowed values:</b><ul><li>7</li><li>30</li><li>180</li><li>365</li></ul></td>
@@ -115,7 +121,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>number</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -128,7 +135,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -138,7 +146,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>array</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -149,7 +158,8 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap"><b>type:</b> <code>string</code>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>string</code>
 <br>
 <b>default:</b> all<br>
 <b>allowed values:</b><ul><li>public</li><li>all</li></ul></td>

From 125c4dedb9210104669c299e2123325c3a82a4ca Mon Sep 17 00:00:00 2001
From: Lucas Larson <LucasLarson@riseup.net>
Date: Thu, 24 Aug 2023 21:42:28 -0400
Subject: [PATCH 154/196] fix(plugins/achievements): find pre-2007 activity
 (#1493) [skip ci]

---
 source/plugins/achievements/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/achievements/index.mjs b/source/plugins/achievements/index.mjs
index 25465b32109..c0c1f3db2f9 100644
--- a/source/plugins/achievements/index.mjs
+++ b/source/plugins/achievements/index.mjs
@@ -82,7 +82,7 @@ async function total({imports}) {
       //Extracting total from github.com/search
       for (let i = 0; (i < 100) && ((!total.users) || (!total.repositories)); i++) {
         const page = await browser.newPage()
-        await page.goto("https://github.com/search?q=+created%3A%3E2007")
+        await page.goto("https://github.com/search?q=created%3A%3E%3D1970")
         const results = await page.evaluate(() => [...[...document.querySelectorAll("h2")].filter(node => /Filter by/.test(node.innerText)).shift()?.nextSibling?.innerText.trim().matchAll(/(?<type>Repositories|Users|Issues)\n(?<count>.*?)M/g) ?? []]) ?? null
         for (const result of results) {
           const type = result[1]?.toLowerCase()

From 693ba354e18fc8cc90d9ce16e575a056917758e4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=B9=A4=E7=BF=94=E4=B8=87=E9=87=8C?=
 <tonycrane@foxmail.com>
Date: Fri, 25 Aug 2023 09:51:33 +0800
Subject: [PATCH 155/196] fix(plugins/achievements): fix progress of rank A
 (#1430) [skip ci]

---
 source/plugins/achievements/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/achievements/index.mjs b/source/plugins/achievements/index.mjs
index c0c1f3db2f9..b950bc7eb66 100644
--- a/source/plugins/achievements/index.mjs
+++ b/source/plugins/achievements/index.mjs
@@ -46,7 +46,7 @@ function rank(x, [c, b, a, s, m]) {
   if (x >= s)
     return {rank: "S", progress: (x - s) / (m - s)}
   if (x >= a)
-    return {rank: "A", progress: (x - a) / (m - a)}
+    return {rank: "A", progress: (x - a) / (s - a)}
   else if (x >= b)
     return {rank: "B", progress: (x - b) / (a - b)}
   else if (x >= c)

From ac9e0f445fdb8c7de36ac8611739a53456800fd9 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 22:12:15 -0400
Subject: [PATCH 156/196] fix(app/utils): don't die on undefined file type
 buffer (relates #1431) [skip ci]

---
 source/app/metrics/utils.mjs | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 346d1dfe754..451052804ad 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -450,14 +450,15 @@ export async function imgb64(image, {width, height, fallback = true} = {}) {
   try {
     if (image.startsWith("http://") || image.startsWith("https://")) {
       const buffer = Buffer.from(await fetch(image).then(response => response.arrayBuffer()))
-      ext = (await fileTypeFromBuffer(buffer)).ext ?? ext
+      ext = (await fileTypeFromBuffer(buffer))?.ext ?? ext
       image = sharp(buffer)
     }
     else {
       image = sharp(image)
     }
   }
-  catch {
+  catch (error) {
+    console.debug(`metrics/imgb64 > error > ${error}${fallback ? " (using fallback image instead)" : ""}`)
     return imgb64(null, {fallback})
   }
   //Resize image

From 84e1732079a966590518c6a70ef1d40758798ea6 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 22:19:40 -0400
Subject: [PATCH 157/196] fix(ci): update node-version to 20

---
 .github/workflows/ci.yml               | 8 ++++----
 .github/workflows/examples.presets.yml | 2 +-
 .github/workflows/test.presets.yml     | 2 +-
 .github/workflows/test.yml             | 2 +-
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 129255309ad..321efc0224e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -53,7 +53,7 @@ jobs:
       - name: Setup NodeJS
         uses: actions/setup-node@v3
         with:
-          node-version: 17
+          node-version: 20
       - name: Pull changes
         run: |
           git checkout master
@@ -76,7 +76,7 @@ jobs:
       - name: Setup NodeJS
         uses: actions/setup-node@v3
         with:
-          node-version: 17
+          node-version: 20
       - name: Pull
         run: git pull
       - name: Checkout main
@@ -205,7 +205,7 @@ jobs:
       - name: Setup NodeJS
         uses: actions/setup-node@v3
         with:
-          node-version: 17
+          node-version: 20
       - name: Setup metrics
         run: npm ci
       - name: Pull
@@ -256,7 +256,7 @@ jobs:
       - name: Setup NodeJS
         uses: actions/setup-node@v3
         with:
-          node-version: 17
+          node-version: 20
       - name: Setup metrics
         run: npm ci
       - name: Publish release
diff --git a/.github/workflows/examples.presets.yml b/.github/workflows/examples.presets.yml
index 2e220d371cc..77f8a72a72a 100644
--- a/.github/workflows/examples.presets.yml
+++ b/.github/workflows/examples.presets.yml
@@ -16,7 +16,7 @@ jobs:
       - name: Setup NodeJS
         uses: actions/setup-node@v3
         with:
-          node-version: 17
+          node-version: 20
       - name: Setup metrics
         run: npm ci
       - name: Publish presets examples
diff --git a/.github/workflows/test.presets.yml b/.github/workflows/test.presets.yml
index 38b992f12d5..f9c867a37bd 100644
--- a/.github/workflows/test.presets.yml
+++ b/.github/workflows/test.presets.yml
@@ -23,7 +23,7 @@ jobs:
       - name: Setup NodeJS
         uses: actions/setup-node@v3
         with:
-          node-version: 17
+          node-version: 20
       - name: Setup metrics
         run: npm ci
       - name: Run tests
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 8de962921cb..8ffb94b77cf 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -19,7 +19,7 @@ jobs:
       - name: Setup NodeJS
         uses: actions/setup-node@v3
         with:
-          node-version: 17
+          node-version: 20
       - name: Setup metrics
         run: npm ci
       - name: Check contributions requirements

From 8f3910382f7f51b3295b9607190261d090d31555 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 23:27:16 -0400
Subject: [PATCH 158/196] fix: deprecate twitter markdown plugin

---
 source/templates/markdown/example.md | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/source/templates/markdown/example.md b/source/templates/markdown/example.md
index 1169aec32f3..0bcd8ad650c 100644
--- a/source/templates/markdown/example.md
+++ b/source/templates/markdown/example.md
@@ -16,7 +16,29 @@ ___
 
 ___
 
-<%- await include(`partials/tweets.ejs`) %>
+> ⚠️ As [Twitter](https://twitter.com) removed the ability to fetch tweets from their free API as part of their new [pricing policy](https://developer.twitter.com/en/docs/twitter-api/getting-started/about-twitter-api), this plugin is no longer maintained.
+
+<!-- <% if (false) { %> -->
+<<!-- -->%- await include(`partials/tweets.ejs`) %<!-- -->>
+<!-- <% } %> -->
+<!-- Example rendering before the plugin was deprecated
+<%- "--"+">" %>
+
+**[🐤 Latest tweets from @github](https://twitter.com/github)**
+> Putting that extra “+” in engineering culture, staff+ engineers lead by example, collaborate, make effective decisions, and support organizational goals. <span class="mention">@rynchantress</span> breaks it down.
+>
+> <a href="GitHub"><img src="https://images.ctfassets.net/s5uo95nf6njh/3sBQCkU6O0Lwc2Tp2LkMrU/e20b22c6ecaa66be267ebdf2d7774816/1920x1080-ReadMe-Site_Hero-Ryn_Daniels.jpg" alt="How to put the plus in ‘staff+’ engineer " height="200"></a>
+>
+> *19:22:01 on 6 Jun 2023*
+
+> It's never been more essential to ensure that your mobile applications are secure. 🔒 Check out two highlights from code scanning and Dependabot that are bringing a heightened level of security to the mobile development process in both Swift and Kotlin.
+>
+> <a href="The GitHub Blog"><img src="https://github.blog/wp-content/uploads/2023/05/1200.630-Security-wLogo.png" alt="Swift support brings broader mobile application security to GitHub Advanced Security | The GitHub Blog" height="200"></a>
+>
+> *16:48:16 on 6 Jun 2023*
+
+<%- "<"+"!--" %>
+-->
 
 ___
 

From d2a73059b5e0b11ccbb273742a0445fcede48fa0 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 23:37:29 -0400
Subject: [PATCH 159/196] fix(ci): markdown screenshot example

---
 .github/scripts/markdown_example.mjs | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/.github/scripts/markdown_example.mjs b/.github/scripts/markdown_example.mjs
index 2859015b73e..d1301b13e9a 100644
--- a/.github/scripts/markdown_example.mjs
+++ b/.github/scripts/markdown_example.mjs
@@ -13,8 +13,10 @@ const page = await browser.newPage()
 //Select markdown example and take screenshot
 await page.setViewport({width: 600, height: 600})
 await page.goto("https://github.com/lowlighter/metrics/blob/examples/metrics.markdown.md")
+await page.waitForSelector("article.markdown-body")
+await new Promise(solve => setTimeout(solve, 4000))
 const clip = await page.evaluate(() => {
-  const {x, y, width, height} = document.querySelector("#readme").getBoundingClientRect()
+  const {x, y, width, height} = document.querySelector("article.markdown-body").getBoundingClientRect()
   return {x, y, width, height}
 })
 await page.screenshot({type: "png", path: "/tmp/metrics.markdown.png", clip, omitBackground: true})

From 2790543c08cd3d7d2530e77c82ed53980c6410c2 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 23:43:00 -0400
Subject: [PATCH 160/196] ci: exclude markdown template example from
 spell-check

---
 .github/actions/spelling/allow.txt    | 1 +
 .github/actions/spelling/excludes.txt | 1 +
 2 files changed, 2 insertions(+)

diff --git a/.github/actions/spelling/allow.txt b/.github/actions/spelling/allow.txt
index ca6de05723c..e4d5df47c2f 100644
--- a/.github/actions/spelling/allow.txt
+++ b/.github/actions/spelling/allow.txt
@@ -12,6 +12,7 @@ githubassets
 https
 IPlayer
 ISteam
+joinmastodon
 leetcode
 MBTI
 Nie
diff --git a/.github/actions/spelling/excludes.txt b/.github/actions/spelling/excludes.txt
index 7b180c74c1a..0900304ea4e 100644
--- a/.github/actions/spelling/excludes.txt
+++ b/.github/actions/spelling/excludes.txt
@@ -51,6 +51,7 @@ ignore$
 ^\Qsource/plugins/sponsors/index.mjs\E$
 ^\Qsource/plugins/stargazers/worldmap/atlas/50m_countries.geojson\E$
 ^\Qsource/templates/classic/partials/splatoon.ejs\E$
+^\Qsource/templates/markdown/example.md\E$
 ^\Qsource/templates/terminal/fonts.css\E$
 ^\Qsource/templates/terminal/partials/screenshot.ejs\E$
 ^\Qtests/mocks/api/github/rest/emojis/get.mjs\E$

From f9fa07d8336ea0cbf8d41afb39744f502b509582 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 24 Aug 2023 23:59:48 -0400
Subject: [PATCH 161/196] ci: change stale/inactivity threshold for bot [skip
 ci]

---
 .github/workflows/stale.yml | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
index 76778ac2422..bbc174e6ca4 100644
--- a/.github/workflows/stale.yml
+++ b/.github/workflows/stale.yml
@@ -14,8 +14,8 @@ jobs:
         with:
           days-before-stale: -1
           stale-pr-message: This pull request seems to be inactive and will be automatically closed in a few days if it remains without any activity.
-          days-before-pr-stale: 21
-          days-before-pr-close: 3
+          days-before-pr-stale: 90
+          days-before-pr-close: 7
           stale-pr-label: ⏹️ stale
           remove-stale-when-updated: yes
           exempt-issue-labels: 📦 dependencies
@@ -28,10 +28,10 @@ jobs:
       - uses: dessant/lock-threads@v4
         with:
           github-token: ${{ github.token }}
-          issue-inactive-days: 14
+          issue-inactive-days: 180
           issue-lock-reason: ""
           add-issue-labels: ☑️ archived
-          pr-inactive-days: 14
+          pr-inactive-days: 180
           pr-lock-reason: ""
           add-pr-labels: ☑️ archived
   workflows:

From 271648e46e091ed8a3bd8172211f6d6fd62fe8af Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Fri, 25 Aug 2023 04:21:38 +0000
Subject: [PATCH 162/196] ci: auto-regenerate files

---
 source/plugins/achievements/README.md         | 21 ++--
 source/plugins/activity/README.md             | 23 ++---
 source/plugins/anilist/README.md              | 19 ++--
 source/plugins/base/README.md                 | 27 ++---
 source/plugins/calendar/README.md             |  6 +-
 source/plugins/code/README.md                 | 19 ++--
 .../community/16personalities/README.md       | 12 +--
 source/plugins/community/chess/README.md      | 11 +--
 source/plugins/community/fortune/README.md    |  3 +-
 source/plugins/community/nightscout/README.md | 21 ++--
 source/plugins/community/poopmap/README.md    |  7 +-
 source/plugins/community/screenshot/README.md | 24 ++---
 source/plugins/community/splatoon/README.md   | 18 +---
 source/plugins/community/stock/README.md      | 13 +--
 source/plugins/contributors/README.md         | 19 ++--
 source/plugins/core/README.md                 | 98 +++++--------------
 source/plugins/discussions/README.md          |  9 +-
 source/plugins/followup/README.md             | 12 +--
 source/plugins/gists/README.md                |  3 +-
 source/plugins/habits/README.md               | 28 ++----
 source/plugins/introduction/README.md         |  6 +-
 source/plugins/isocalendar/README.md          |  6 +-
 source/plugins/languages/README.md            | 52 ++++------
 source/plugins/leetcode/README.md             | 16 +--
 source/plugins/licenses/README.md             | 12 +--
 source/plugins/lines/README.md                | 13 +--
 source/plugins/music/README.md                | 24 ++---
 source/plugins/notable/README.md              | 22 ++---
 source/plugins/pagespeed/README.md            | 14 +--
 source/plugins/people/README.md               | 23 ++---
 source/plugins/posts/README.md                | 16 +--
 source/plugins/projects/README.md             | 10 +-
 source/plugins/reactions/README.md            | 25 ++---
 source/plugins/repositories/README.md         | 22 ++---
 source/plugins/rss/README.md                  |  9 +-
 source/plugins/skyline/README.md              | 18 ++--
 source/plugins/sponsors/README.md             | 15 +--
 source/plugins/sponsorships/README.md         |  9 +-
 source/plugins/stackoverflow/README.md        | 16 +--
 source/plugins/stargazers/README.md           | 19 ++--
 source/plugins/starlists/README.md            | 30 ++----
 source/plugins/stars/README.md                |  6 +-
 source/plugins/steam/README.md                | 23 ++---
 source/plugins/support/README.md              |  3 +-
 source/plugins/topics/README.md               | 12 +--
 source/plugins/traffic/README.md              |  4 +-
 source/plugins/tweets/README.md               | 11 +--
 source/plugins/wakatime/README.md             | 26 ++---
 48 files changed, 263 insertions(+), 592 deletions(-)

diff --git a/source/plugins/achievements/README.md b/source/plugins/achievements/README.md
index 8b39e21f2de..8683ac4353d 100644
--- a/source/plugins/achievements/README.md
+++ b/source/plugins/achievements/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -56,8 +55,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> C<br>
 <b>allowed values:</b><ul><li>S</li><li>A</li><li>B</li><li>C</li><li>X</li></ul></td>
@@ -68,8 +66,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -83,8 +80,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> detailed<br>
 <b>allowed values:</b><ul><li>detailed</li><li>compact</li></ul></td>
@@ -95,8 +91,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -110,8 +105,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -123,8 +117,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
diff --git a/source/plugins/activity/README.md b/source/plugins/activity/README.md
index 40a41042b31..c94f9acc788 100644
--- a/source/plugins/activity/README.md
+++ b/source/plugins/activity/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -50,8 +49,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 1000)</i>
@@ -64,8 +62,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(100 ≤
 𝑥
 ≤ 1000)</i>
@@ -78,8 +75,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 365)</i>
@@ -94,8 +90,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> all<br>
 <b>allowed values:</b><ul><li>public</li><li>all</li></ul></td>
@@ -106,8 +101,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -118,7 +112,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -131,7 +124,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>users_ignored</code><br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -158,8 +150,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> all<br>
diff --git a/source/plugins/anilist/README.md b/source/plugins/anilist/README.md
index 74a354b269e..d86f7c16306 100644
--- a/source/plugins/anilist/README.md
+++ b/source/plugins/anilist/README.md
@@ -41,8 +41,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -57,7 +56,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User login</code><br></td>
@@ -68,8 +66,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> anime, manga<br>
@@ -87,8 +84,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> favorites<br>
@@ -100,8 +96,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -114,8 +109,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -129,8 +123,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/base/README.md b/source/plugins/base/README.md
index 28e8d34a944..e797cbffd49 100644
--- a/source/plugins/base/README.md
+++ b/source/plugins/base/README.md
@@ -48,8 +48,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> header, activity, community, repositories, metadata<br>
@@ -70,8 +69,7 @@ This currently improves the accuracy of the following statistics:</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.github.overuse</i></li>
 </ul>
@@ -85,8 +83,7 @@ This currently improves the accuracy of the following statistics:</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -100,8 +97,7 @@ Only use this option when using a plugin that can be configured with <a href="/s
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -112,8 +108,7 @@ Only use this option when using a plugin that can be configured with <a href="/s
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -127,8 +122,7 @@ This setting may not be supported by all plugins.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 100)</i>
@@ -141,8 +135,7 @@ This setting may not be supported by all plugins.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -160,8 +153,7 @@ Broad affiliations will result in less representative metrics.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> owner<br>
@@ -174,7 +166,6 @@ Broad affiliations will result in less representative metrics.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -187,7 +178,6 @@ Broad affiliations will result in less representative metrics.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
@@ -202,7 +192,6 @@ Broad affiliations will result in less representative metrics.</p>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
 ⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
diff --git a/source/plugins/calendar/README.md b/source/plugins/calendar/README.md
index c8a3c6a36cd..178a91b4f6c 100644
--- a/source/plugins/calendar/README.md
+++ b/source/plugins/calendar/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -60,8 +59,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <br>
 <b>zero behaviour:</b> disable</br>
 <b>default:</b> 1<br></td>
diff --git a/source/plugins/code/README.md b/source/plugins/code/README.md
index afb90c44a0c..e0910140684 100644
--- a/source/plugins/code/README.md
+++ b/source/plugins/code/README.md
@@ -45,8 +45,7 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -56,8 +55,7 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 128)</i>
@@ -70,8 +68,7 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(100 ≤
 𝑥
 ≤ 1000)</i>
@@ -84,8 +81,7 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 365)</i>
@@ -100,8 +96,7 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> public<br>
 <b>allowed values:</b><ul><li>public</li><li>all</li></ul></td>
@@ -113,7 +108,6 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -124,8 +118,7 @@ Use at your own risk, <em>metrics</em> and its authors cannot be held responsibl
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
diff --git a/source/plugins/community/16personalities/README.md b/source/plugins/community/16personalities/README.md
index 734953cc1a8..50b64edd85d 100644
--- a/source/plugins/community/16personalities/README.md
+++ b/source/plugins/community/16personalities/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -58,8 +57,7 @@ Login with the generated password received in your mailbox and copy the link tha
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -73,8 +71,7 @@ Login with the generated password received in your mailbox and copy the link tha
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> personality<br>
@@ -86,8 +83,7 @@ Login with the generated password received in your mailbox and copy the link tha
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/community/chess/README.md b/source/plugins/community/chess/README.md
index b87742ce0af..fddbc6c3e12 100644
--- a/source/plugins/community/chess/README.md
+++ b/source/plugins/community/chess/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,7 +51,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.chess.any</i></li>
@@ -67,7 +65,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User login</code><br></td>
@@ -78,8 +75,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>allowed values:</b><ul><li>lichess.org</li></ul></td>
   </tr>
@@ -94,8 +90,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>json</code>
+    <td nowrap="nowrap"><b>type:</b> <code>json</code>
 <br>
 <b>default:</b> <details><summary>→ Click to expand</summary><pre language="json"><code>{
   "size": 40,
diff --git a/source/plugins/community/fortune/README.md b/source/plugins/community/fortune/README.md
index 025e2500a90..90a342ff25f 100644
--- a/source/plugins/community/fortune/README.md
+++ b/source/plugins/community/fortune/README.md
@@ -37,8 +37,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/community/nightscout/README.md b/source/plugins/community/nightscout/README.md
index 25e041f4cca..0f20def1cb3 100644
--- a/source/plugins/community/nightscout/README.md
+++ b/source/plugins/community/nightscout/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,8 +50,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> https://example.herokuapp.com<br></td>
   </tr>
@@ -62,8 +60,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -76,8 +73,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -89,8 +85,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -102,8 +97,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -115,8 +109,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
diff --git a/source/plugins/community/poopmap/README.md b/source/plugins/community/poopmap/README.md
index fe905b31d8c..c6dc714305d 100644
--- a/source/plugins/community/poopmap/README.md
+++ b/source/plugins/community/poopmap/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,7 +51,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -62,8 +60,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <br>
 <b>default:</b> 7<br>
 <b>allowed values:</b><ul><li>7</li><li>30</li><li>180</li><li>365</li></ul></td>
diff --git a/source/plugins/community/screenshot/README.md b/source/plugins/community/screenshot/README.md
index e6b14c726ad..cf02e99a35c 100644
--- a/source/plugins/community/screenshot/README.md
+++ b/source/plugins/community/screenshot/README.md
@@ -38,8 +38,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -53,8 +52,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> Screenshot<br></td>
   </tr>
@@ -64,8 +62,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -74,8 +71,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> body<br></td>
   </tr>
@@ -92,8 +88,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> image<br>
 <b>allowed values:</b><ul><li>image</li><li>text</li></ul></td>
@@ -104,8 +99,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>json</code>
+    <td nowrap="nowrap"><b>type:</b> <code>json</code>
 <br>
 <b>default:</b> <details><summary>→ Click to expand</summary><pre language="json"><code>{
   "width": 1280,
@@ -119,8 +113,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -132,8 +125,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/community/splatoon/README.md b/source/plugins/community/splatoon/README.md
index 13e894065fd..99e2efaccd8 100644
--- a/source/plugins/community/splatoon/README.md
+++ b/source/plugins/community/splatoon/README.md
@@ -42,8 +42,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -54,7 +53,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.nintendo.splatnet</i></li>
@@ -73,8 +71,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> player, versus, salmon-run<br></td>
@@ -85,8 +82,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 6)</i>
@@ -99,8 +95,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 6)</i>
@@ -115,8 +110,7 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.statink</i></li>
 </ul>
@@ -131,7 +125,6 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -148,7 +141,6 @@ Requires <a href="/source/plugins/community/splatoon/README.md#plugin_splatoon_s
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> splatnet<br>
diff --git a/source/plugins/community/stock/README.md b/source/plugins/community/stock/README.md
index deb18ed9b55..1a4f5953c04 100644
--- a/source/plugins/community/stock/README.md
+++ b/source/plugins/community/stock/README.md
@@ -37,8 +37,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.npm.optional.d3</i></li>
 <li><i>metrics.api.yahoo.finance</i></li>
@@ -54,7 +53,6 @@
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -64,8 +62,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -88,8 +85,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 1d<br>
 <b>allowed values:</b><ul><li>1d</li><li>5d</li><li>1mo</li><li>3mo</li><li>6mo</li><li>1y</li><li>2y</li><li>5y</li><li>10y</li><li>ytd</li><li>max</li></ul></td>
@@ -108,8 +104,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 5m<br>
 <b>allowed values:</b><ul><li>1m</li><li>2m</li><li>5m</li><li>15m</li><li>60m</li><li>1d</li></ul></td>
diff --git a/source/plugins/contributors/README.md b/source/plugins/contributors/README.md
index 58ed6e612d8..f32bf23423b 100644
--- a/source/plugins/contributors/README.md
+++ b/source/plugins/contributors/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,8 +51,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -63,8 +61,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> master<br></td>
   </tr>
@@ -76,7 +73,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>users_ignored</code><br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -87,8 +83,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -102,8 +97,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> contributors<br>
@@ -117,8 +111,7 @@ Pass a JSON object mapping category with file globs</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.tempdir</i></li>
 <li><i>metrics.run.git</i></li>
diff --git a/source/plugins/core/README.md b/source/plugins/core/README.md
index 7b2625e75f8..518a3f3bdf3 100644
--- a/source/plugins/core/README.md
+++ b/source/plugins/core/README.md
@@ -468,7 +468,6 @@ When doing so, any settings which defaults on user fetched values will not be te
   <tr>
     <td nowrap="nowrap">✔️ Required<br>
 🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -480,7 +479,6 @@ When doing so, any settings which defaults on user fetched values will not be te
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -492,7 +490,6 @@ When doing so, any settings which defaults on user fetched values will not be te
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -507,7 +504,6 @@ When doing so, any settings which defaults on user fetched values will not be te
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br>
 <b>default:</b> ${{ github.token }}<br></td>
@@ -519,8 +515,7 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -530,8 +525,7 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> Update ${filename} - [Skip GitHub Action]<br></td>
   </tr>
@@ -543,7 +537,6 @@ When doing so, any settings which defaults on user fetched values will not be te
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -554,8 +547,7 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> github-metrics.*<br></td>
   </tr>
@@ -566,8 +558,7 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> TEMPLATE.md<br></td>
   </tr>
@@ -577,8 +568,7 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> .cache<br></td>
   </tr>
@@ -603,8 +593,7 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> commit<br>
 <b>allowed values:</b><ul><li>none</li><li>commit</li><li>pull-request</li><li>pull-request-merge</li><li>pull-request-squash</li><li>pull-request-rebase</li><li>gist</li></ul></td>
@@ -622,8 +611,7 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> always<br>
 <b>allowed values:</b><ul><li>always</li><li>data-changed</li></ul></td>
@@ -640,8 +628,7 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> css, xml<br>
@@ -654,8 +641,7 @@ When doing so, any settings which defaults on user fetched values will not be te
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.setup.community.templates</i></li>
 </ul>
@@ -671,8 +657,7 @@ See <a href="https://github.com/lowlighter/metrics/blob/master/README.md#%EF%B8%
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> classic<br></td>
   </tr>
@@ -687,8 +672,7 @@ This is mostly useful for custom templates.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>json</code>
+    <td nowrap="nowrap"><b>type:</b> <code>json</code>
 <br>
 <b>default:</b> <details><summary>→ Click to expand</summary><pre language="json"><code>{}</code></pre></details><br></td>
   </tr>
@@ -703,8 +687,7 @@ Useful to avoid creating a new template just to tweak some styling</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.user.css</i></li>
 </ul>
@@ -724,8 +707,7 @@ It is run after transformations and optimizations, but just before resizing.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.user.js</i></li>
 </ul>
@@ -741,7 +723,6 @@ Leave empty to use default endpoint.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -757,7 +738,6 @@ Leave empty to use default endpoint.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -769,7 +749,6 @@ Leave empty to use default endpoint.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -783,7 +762,6 @@ You can override the content order by using this setting.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -797,7 +775,6 @@ May increase filesize.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -813,7 +790,6 @@ See full list at <a href="https://api.github.com/emojis">https://api.github.com/
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
@@ -831,7 +807,6 @@ Size must be a supported icon size (12, 16 or 24).
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -851,7 +826,6 @@ Size must be a supported icon size (12, 16 or 24).
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> regular<br>
@@ -864,7 +838,6 @@ Size must be a supported icon size (12, 16 or 24).
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
@@ -877,7 +850,6 @@ Size must be a supported icon size (12, 16 or 24).
   </tr>
   <tr>
     <td nowrap="nowrap">⏭️ Global option<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
@@ -902,8 +874,7 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 0, 8 + 11%<br></td>
   </tr>
@@ -923,8 +894,7 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> auto<br>
 <b>allowed values:</b><ul><li>auto</li><li>svg</li><li>png</li><li>jpeg</li><li>json</li><li>markdown</li><li>markdown-pdf</li><li>insights</li></ul></td>
@@ -936,7 +906,6 @@ It can result in cropped or oversized outputs.</p>
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.setup.community.presets</i></li>
@@ -951,8 +920,7 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 10)</i>
@@ -965,8 +933,7 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 3600)</i>
@@ -979,8 +946,7 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 10)</i>
@@ -993,8 +959,7 @@ It can result in cropped or oversized outputs.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 3600)</i>
@@ -1014,7 +979,6 @@ Be sure to disable this option when asking for help or submitting bug reports.</
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
@@ -1027,8 +991,7 @@ Be sure to disable this option when asking for help or submitting bug reports.</
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 3600)</i>
@@ -1043,8 +1006,7 @@ Be sure to disable this option when asking for help or submitting bug reports.</
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 5000)</i>
@@ -1059,8 +1021,7 @@ Be sure to disable this option when asking for help or submitting bug reports.</
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 5000)</i>
@@ -1075,8 +1036,7 @@ Be sure to disable this option when asking for help or submitting bug reports.</
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 30)</i>
@@ -1089,8 +1049,7 @@ Be sure to disable this option when asking for help or submitting bug reports.</
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -1104,7 +1063,6 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
@@ -1118,7 +1076,6 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -1132,7 +1089,6 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -1145,7 +1101,6 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.npm.optional.libxml2</i></li>
@@ -1180,7 +1135,6 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(space-separated)</i>
 <br>
@@ -1194,7 +1148,6 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -1210,7 +1163,6 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
@@ -1226,7 +1178,6 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(space-separated)</i>
 <br>
@@ -1240,7 +1191,6 @@ This option has no effects on forks (images will always be rebuilt from Dockerfi
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
 🔧 For development<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
diff --git a/source/plugins/discussions/README.md b/source/plugins/discussions/README.md
index 69568a4b726..db25d2a82ab 100644
--- a/source/plugins/discussions/README.md
+++ b/source/plugins/discussions/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -50,8 +49,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -62,8 +60,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <br>
 <b>zero behaviour:</b> disable</br>
 <b>default:</b> 0<br></td>
diff --git a/source/plugins/followup/README.md b/source/plugins/followup/README.md
index 2615d217b8c..db00e7a9dba 100644
--- a/source/plugins/followup/README.md
+++ b/source/plugins/followup/README.md
@@ -41,8 +41,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -56,8 +55,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> repositories<br>
@@ -69,8 +67,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.github.overuse</i></li>
 </ul>
@@ -84,8 +81,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/gists/README.md b/source/plugins/gists/README.md
index 91beea168d7..572ba235f3a 100644
--- a/source/plugins/gists/README.md
+++ b/source/plugins/gists/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/habits/README.md b/source/plugins/habits/README.md
index 5e6d92e5128..93ee388e79e 100644
--- a/source/plugins/habits/README.md
+++ b/source/plugins/habits/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,8 +51,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 1000)</i>
@@ -67,7 +65,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -78,8 +75,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 30)</i>
@@ -93,8 +89,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -106,8 +101,7 @@ Recent language activity may also displayed (it requires extras features to be e
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.github.overuse</i></li>
 <li><i>metrics.run.tempdir</i></li>
@@ -130,8 +124,7 @@ Recent language activity may also displayed (it requires extras features to be e
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.npm.optional.d3</i></li>
 </ul>
@@ -146,8 +139,7 @@ Recent language activity may also displayed (it requires extras features to be e
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -157,8 +149,7 @@ Recent language activity may also displayed (it requires extras features to be e
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 8)</i>
@@ -172,8 +163,7 @@ Recent language activity may also displayed (it requires extras features to be e
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 0%<br></td>
   </tr>
diff --git a/source/plugins/introduction/README.md b/source/plugins/introduction/README.md
index 765a015c056..ff20b97cf6e 100644
--- a/source/plugins/introduction/README.md
+++ b/source/plugins/introduction/README.md
@@ -41,8 +41,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,8 +51,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/isocalendar/README.md b/source/plugins/isocalendar/README.md
index 7dd5faecf1e..0dcab7a34e0 100644
--- a/source/plugins/isocalendar/README.md
+++ b/source/plugins/isocalendar/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -55,8 +54,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> half-year<br>
 <b>allowed values:</b><ul><li>half-year</li><li>full-year</li></ul></td>
diff --git a/source/plugins/languages/README.md b/source/plugins/languages/README.md
index e6a8ab6e139..ca77c7af764 100644
--- a/source/plugins/languages/README.md
+++ b/source/plugins/languages/README.md
@@ -42,8 +42,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -53,8 +52,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -65,7 +63,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -76,8 +73,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 8)</i>
@@ -91,8 +87,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 0%<br></td>
   </tr>
@@ -104,8 +99,7 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -115,8 +109,7 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> github<br></td>
@@ -127,8 +120,7 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -138,8 +130,7 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> most-used<br>
@@ -152,8 +143,7 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>allowed values:</b><ul><li>bytes-size</li><li>percentage</li><li>lines</li></ul></td>
@@ -167,8 +157,7 @@ It will be automatically hidden if empty.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.cpu.overuse</i></li>
 <li><i>metrics.run.tempdir</i></li>
@@ -199,8 +188,7 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -210,8 +198,7 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 60)</i>
@@ -224,8 +211,7 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 15)</i>
@@ -239,8 +225,7 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> markup, programming<br>
@@ -252,8 +237,7 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> markup, programming<br>
@@ -265,8 +249,7 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(100 ≤
 𝑥
 ≤ 1000)</i>
@@ -279,8 +262,7 @@ In this case the repository must be accessible directly.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 365)</i>
diff --git a/source/plugins/leetcode/README.md b/source/plugins/leetcode/README.md
index 754503c3f01..896b56ed086 100644
--- a/source/plugins/leetcode/README.md
+++ b/source/plugins/leetcode/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,7 +50,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User login</code><br></td>
@@ -67,8 +65,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> solved<br>
@@ -80,8 +77,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -95,8 +91,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <br></td>
   </tr>
   <tr>
@@ -105,8 +100,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 15)</i>
diff --git a/source/plugins/licenses/README.md b/source/plugins/licenses/README.md
index ffe034c91ce..723148978d1 100644
--- a/source/plugins/licenses/README.md
+++ b/source/plugins/licenses/README.md
@@ -69,8 +69,7 @@ Dependencies will be analyzed by [GitHub licensed](https://github.com/github/lic
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.cpu.overuse</i></li>
 <li><i>metrics.run.tempdir</i></li>
@@ -92,8 +91,7 @@ The example command is intended for NodeJs projects that use <code>npm</code> to
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -102,8 +100,7 @@ The example command is intended for NodeJs projects that use <code>npm</code> to
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -113,8 +110,7 @@ The example command is intended for NodeJs projects that use <code>npm</code> to
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
diff --git a/source/plugins/lines/README.md b/source/plugins/lines/README.md
index 3375b4e3ebc..1271e38e4e7 100644
--- a/source/plugins/lines/README.md
+++ b/source/plugins/lines/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,7 +51,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -71,8 +69,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> base<br>
@@ -84,8 +81,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -98,8 +94,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <br>
 <b>zero behaviour:</b> disable</br>
 <b>default:</b> 1<br></td>
diff --git a/source/plugins/music/README.md b/source/plugins/music/README.md
index 562bafc5218..35b8963c07d 100644
--- a/source/plugins/music/README.md
+++ b/source/plugins/music/README.md
@@ -41,8 +41,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -63,8 +62,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>allowed values:</b><ul><li>apple</li><li>spotify</li><li>lastfm</li><li>youtube</li></ul></td>
   </tr>
@@ -82,7 +80,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.music.any</i></li>
@@ -97,7 +94,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User login</code><br></td>
@@ -114,8 +110,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>allowed values:</b><ul><li>playlist</li><li>recent</li><li>top</li></ul></td>
   </tr>
@@ -127,7 +122,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -137,8 +131,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 100)</i>
@@ -151,8 +144,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -167,8 +159,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> short<br>
 <b>allowed values:</b><ul><li>short</li><li>medium</li><li>long</li></ul></td>
@@ -183,8 +174,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> tracks<br>
 <b>allowed values:</b><ul><li>tracks</li><li>artists</li></ul></td>
diff --git a/source/plugins/notable/README.md b/source/plugins/notable/README.md
index 8fde7d1fc8c..c57c48c2f4e 100644
--- a/source/plugins/notable/README.md
+++ b/source/plugins/notable/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -55,8 +54,7 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -66,7 +64,6 @@ Some repositories may not be able to reported advanced stats and in the case the
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
@@ -82,8 +79,7 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> organization<br>
 <b>allowed values:</b><ul><li>all</li><li>organization</li><li>user</li></ul></td>
@@ -95,8 +91,7 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -106,8 +101,7 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.github.overuse</i></li>
 </ul>
@@ -127,8 +121,7 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> commit<br>
@@ -140,8 +133,7 @@ Some repositories may not be able to reported advanced stats and in the case the
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/pagespeed/README.md b/source/plugins/pagespeed/README.md
index 402690a0c38..ef1e08aa2ae 100644
--- a/source/plugins/pagespeed/README.md
+++ b/source/plugins/pagespeed/README.md
@@ -42,8 +42,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -57,7 +56,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.google.pagespeed</i></li>
@@ -72,7 +70,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User attached website</code><br></td>
@@ -92,8 +89,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -104,8 +100,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -115,8 +110,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/people/README.md b/source/plugins/people/README.md
index a1a8a63f27e..a3c8b89810a 100644
--- a/source/plugins/people/README.md
+++ b/source/plugins/people/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,8 +50,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -66,8 +64,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -79,8 +76,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -90,8 +86,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(8 ≤
 𝑥
 ≤ 64)</i>
@@ -122,8 +117,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> followers, following<br>
@@ -137,7 +131,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -151,7 +144,6 @@ The option <a href="/source/plugins/people/README.md#plugin_people_types"><code>
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -164,8 +156,7 @@ This will fetch additional data (10 times <a href="/source/plugins/people/README
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/posts/README.md b/source/plugins/posts/README.md
index 10e7fa36a4a..4054213aff6 100644
--- a/source/plugins/posts/README.md
+++ b/source/plugins/posts/README.md
@@ -37,8 +37,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,8 +51,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>allowed values:</b><ul><li>dev.to</li><li>hashnode</li></ul></td>
   </tr>
@@ -64,7 +62,6 @@
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User login</code><br></td>
@@ -75,8 +72,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -86,8 +82,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -97,8 +92,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 30)</i>
diff --git a/source/plugins/projects/README.md b/source/plugins/projects/README.md
index e926ca29255..21eea26d74c 100644
--- a/source/plugins/projects/README.md
+++ b/source/plugins/projects/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,8 +50,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 100)</i>
@@ -70,7 +68,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -81,8 +78,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
diff --git a/source/plugins/reactions/README.md b/source/plugins/reactions/README.md
index 4953d04feae..e1e0973daec 100644
--- a/source/plugins/reactions/README.md
+++ b/source/plugins/reactions/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -50,8 +49,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 1000)</i>
@@ -64,8 +62,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 1000)</i>
@@ -78,8 +75,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 1000)</i>
@@ -92,8 +88,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 1000)</i>
@@ -106,8 +101,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -124,8 +118,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> absolute<br>
 <b>allowed values:</b><ul><li>absolute</li><li>relative</li></ul></td>
@@ -136,8 +129,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>allowed values:</b><ul><li>count</li><li>percentage</li></ul></td>
@@ -150,7 +142,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>users_ignored</code><br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
diff --git a/source/plugins/repositories/README.md b/source/plugins/repositories/README.md
index 2da30188f9e..935dd7c0052 100644
--- a/source/plugins/repositories/README.md
+++ b/source/plugins/repositories/README.md
@@ -45,8 +45,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -58,7 +57,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
@@ -69,8 +67,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 6)</i>
@@ -83,8 +80,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 100)</i>
@@ -97,8 +93,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 100)</i>
@@ -111,8 +106,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <br>
 <b>default:</b> featured, pinned, starred, random<br>
 <b>allowed values:</b><ul><li>featured</li><li>pinned</li><li>starred</li><li>random</li></ul></td>
@@ -123,8 +117,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -141,8 +134,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> owner<br>
diff --git a/source/plugins/rss/README.md b/source/plugins/rss/README.md
index e7834337dfe..75290cc39fc 100644
--- a/source/plugins/rss/README.md
+++ b/source/plugins/rss/README.md
@@ -36,8 +36,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -47,8 +46,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -57,8 +55,7 @@
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 30)</i>
diff --git a/source/plugins/skyline/README.md b/source/plugins/skyline/README.md
index 902f21f66d2..ead7fb0d4ef 100644
--- a/source/plugins/skyline/README.md
+++ b/source/plugins/skyline/README.md
@@ -44,8 +44,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.cpu.overuse</i></li>
 <li><i>metrics.npm.optional.gifencoder</i></li>
@@ -61,8 +60,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(2008 ≤
 𝑥)</i>
 <br>
@@ -76,8 +74,7 @@ A higher number of frames will increase file size.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 120)</i>
@@ -91,8 +88,7 @@ A higher number of frames will increase file size.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0.1 ≤
 𝑥
 ≤ 1)</i>
@@ -107,8 +103,7 @@ Using this mode significantly increase file size as each frame is encoded separa
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -126,8 +121,7 @@ Using this mode significantly increase file size as each frame is encoded separa
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.user.js</i></li>
 </ul>
diff --git a/source/plugins/sponsors/README.md b/source/plugins/sponsors/README.md
index 021516d2dcb..76c4071e0a7 100644
--- a/source/plugins/sponsors/README.md
+++ b/source/plugins/sponsors/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -56,8 +55,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> goal, list, about<br>
@@ -73,8 +71,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -84,8 +81,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(8 ≤
 𝑥
 ≤ 64)</i>
@@ -98,8 +94,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> Sponsor Me!<br></td>
   </tr>
diff --git a/source/plugins/sponsorships/README.md b/source/plugins/sponsorships/README.md
index d23645a7149..068b30b388f 100644
--- a/source/plugins/sponsorships/README.md
+++ b/source/plugins/sponsorships/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -54,8 +53,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> amount, sponsorships<br>
@@ -67,8 +65,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(8 ≤
 𝑥
 ≤ 64)</i>
diff --git a/source/plugins/stackoverflow/README.md b/source/plugins/stackoverflow/README.md
index e4ebd3e1183..66e89b8cbb2 100644
--- a/source/plugins/stackoverflow/README.md
+++ b/source/plugins/stackoverflow/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,7 +50,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>number</code>
 <br>
 <b>default:</b> 0<br></td>
@@ -68,8 +66,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> answers-top, questions-recent<br>
@@ -81,8 +78,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 30)</i>
@@ -96,8 +92,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -110,8 +105,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
diff --git a/source/plugins/stargazers/README.md b/source/plugins/stargazers/README.md
index e920e0b844d..a554e60aecf 100644
--- a/source/plugins/stargazers/README.md
+++ b/source/plugins/stargazers/README.md
@@ -52,8 +52,7 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -64,8 +63,7 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -79,8 +77,7 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -97,8 +94,7 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.npm.optional.d3</i></li>
 </ul>
@@ -113,8 +109,7 @@ Follow instructions from their [documentation](https://developers.google.com/map
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.google.maps</i></li>
 <li><i>metrics.npm.optional.d3</i></li>
@@ -130,7 +125,6 @@ Follow instructions from their [documentation](https://developers.google.com/map
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -142,8 +136,7 @@ Helps to avoid consuming too much Google Geocoding API requests while still bein
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
diff --git a/source/plugins/starlists/README.md b/source/plugins/starlists/README.md
index 6433f75b33b..a821c9c01cf 100644
--- a/source/plugins/starlists/README.md
+++ b/source/plugins/starlists/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -55,8 +54,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 100)</i>
@@ -69,8 +67,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 100)</i>
@@ -83,8 +80,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -94,8 +90,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -108,8 +103,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -119,8 +113,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br></td>
   </tr>
   <tr>
@@ -130,8 +123,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> yes<br></td>
   </tr>
@@ -142,8 +134,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -155,8 +146,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
diff --git a/source/plugins/stars/README.md b/source/plugins/stars/README.md
index f171ece827b..2941d8c6c00 100644
--- a/source/plugins/stars/README.md
+++ b/source/plugins/stars/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -50,8 +49,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 100)</i>
diff --git a/source/plugins/steam/README.md b/source/plugins/steam/README.md
index 676dc324e93..32b33db0e40 100644
--- a/source/plugins/steam/README.md
+++ b/source/plugins/steam/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,7 +51,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.steam</i></li>
@@ -71,8 +69,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br>
 <b>default:</b> player, most-played, recently-played<br></td>
@@ -85,7 +82,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br></td>
   </tr>
@@ -96,8 +92,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -107,8 +102,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -121,8 +115,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -135,8 +128,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -148,8 +140,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
diff --git a/source/plugins/support/README.md b/source/plugins/support/README.md
index 2bb70ac5781..48f75ac8dbf 100644
--- a/source/plugins/support/README.md
+++ b/source/plugins/support/README.md
@@ -41,8 +41,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
diff --git a/source/plugins/topics/README.md b/source/plugins/topics/README.md
index 9e582909341..946cee8f25c 100644
--- a/source/plugins/topics/README.md
+++ b/source/plugins/topics/README.md
@@ -41,8 +41,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.run.puppeteer.scrapping</i></li>
 </ul>
@@ -62,8 +61,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> starred<br>
 <b>allowed values:</b><ul><li>labels</li><li>icons</li><li>starred</li><li>mastered</li></ul></td>
@@ -80,8 +78,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> stars<br>
 <b>allowed values:</b><ul><li>stars</li><li>activity</li><li>starred</li><li>random</li></ul></td>
@@ -92,8 +89,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥
 ≤ 20)</i>
diff --git a/source/plugins/traffic/README.md b/source/plugins/traffic/README.md
index 6c4fd2f9d27..524a75791c6 100644
--- a/source/plugins/traffic/README.md
+++ b/source/plugins/traffic/README.md
@@ -39,8 +39,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -51,7 +50,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏩ Inherits <code>repositories_skipped</code><br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>array</code>
 <i>(newline-separated)</i>
 <br></td>
diff --git a/source/plugins/tweets/README.md b/source/plugins/tweets/README.md
index cb8745f8da0..c1e903cdf85 100644
--- a/source/plugins/tweets/README.md
+++ b/source/plugins/tweets/README.md
@@ -42,8 +42,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-🌐 Web instances must configure <code>settings.json</code>:
+    <td nowrap="nowrap">🌐 Web instances must configure <code>settings.json</code>:
 <ul>
 <li><i>metrics.api.twitter.tweets</i></li>
 </ul>
@@ -58,7 +57,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -69,7 +67,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> <code>→ User attached twitter</code><br></td>
@@ -81,8 +78,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -92,8 +88,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(1 ≤
 𝑥
 ≤ 10)</i>
diff --git a/source/plugins/wakatime/README.md b/source/plugins/wakatime/README.md
index 57f7c9910c8..5b5d02fcf19 100644
--- a/source/plugins/wakatime/README.md
+++ b/source/plugins/wakatime/README.md
@@ -40,8 +40,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -52,7 +51,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">🔐 Token<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>token</code>
 <br></td>
   </tr>
@@ -63,8 +61,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> https://wakatime.com<br></td>
   </tr>
@@ -75,7 +72,6 @@ All product and company names are trademarks™ or registered® trademarks of th
   </tr>
   <tr>
     <td nowrap="nowrap">⏯️ Cannot be preset<br>
-✨ On <code>master</code>/<code>main</code><br>
 <b>type:</b> <code>string</code>
 <br>
 <b>default:</b> current<br></td>
@@ -97,8 +93,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <br>
 <b>default:</b> time, projects, projects-graphs, languages, languages-graphs, editors, os<br>
 <b>allowed values:</b><ul><li>time</li><li>projects</li><li>projects-graphs</li><li>languages</li><li>languages-graphs</li><li>editors</li><li>editors-graphs</li><li>os</li><li>os-graphs</li></ul></td>
@@ -109,8 +104,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> 7<br>
 <b>allowed values:</b><ul><li>7</li><li>30</li><li>180</li><li>365</li></ul></td>
@@ -121,8 +115,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>
@@ -135,8 +128,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>boolean</code>
+    <td nowrap="nowrap"><b>type:</b> <code>boolean</code>
 <br>
 <b>default:</b> no<br></td>
   </tr>
@@ -146,8 +138,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>array</code>
+    <td nowrap="nowrap"><b>type:</b> <code>array</code>
 <i>(comma-separated)</i>
 <br></td>
   </tr>
@@ -158,8 +149,7 @@ All product and company names are trademarks™ or registered® trademarks of th
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>string</code>
+    <td nowrap="nowrap"><b>type:</b> <code>string</code>
 <br>
 <b>default:</b> all<br>
 <b>allowed values:</b><ul><li>public</li><li>all</li></ul></td>

From d0578c0db490ebf76e7c41306b4d0941de392b81 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 11 Sep 2023 19:36:05 -0400
Subject: [PATCH 163/196] fix(ci): failing step

---
 .github/workflows/examples.yml         | 5 -----
 source/templates/markdown/README.md    | 5 -----
 source/templates/markdown/examples.yml | 5 -----
 tests/cases/markdown.template.yml      | 5 -----
 4 files changed, 20 deletions(-)

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index e0f905044d3..38b5f6e2956 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -1238,11 +1238,6 @@ jobs:
           plugin_rss: yes
           plugin_rss_source: https://news.ycombinator.com/rss
           plugin_rss_limit: 4
-          plugin_tweets: yes
-          plugin_tweets_token: ${{ secrets.TWITTER_TOKEN }}
-          plugin_tweets_user: github
-          plugin_tweets_attachments: yes
-          plugin_tweets_limit: 2
           plugin_topics: yes
           plugin_topics_limit: 24
           plugin_isocalendar: yes
diff --git a/source/templates/markdown/README.md b/source/templates/markdown/README.md
index ac565ece076..ccd22493c76 100644
--- a/source/templates/markdown/README.md
+++ b/source/templates/markdown/README.md
@@ -168,11 +168,6 @@ with:
   plugin_rss: yes
   plugin_rss_source: https://news.ycombinator.com/rss
   plugin_rss_limit: 4
-  plugin_tweets: yes
-  plugin_tweets_token: ${{ secrets.TWITTER_TOKEN }}
-  plugin_tweets_user: github
-  plugin_tweets_attachments: yes
-  plugin_tweets_limit: 2
   plugin_topics: yes
   plugin_topics_limit: 24
   plugin_isocalendar: yes
diff --git a/source/templates/markdown/examples.yml b/source/templates/markdown/examples.yml
index 8d6d85152b9..41a7ef683a1 100644
--- a/source/templates/markdown/examples.yml
+++ b/source/templates/markdown/examples.yml
@@ -30,11 +30,6 @@
     plugin_rss: yes
     plugin_rss_source: https://news.ycombinator.com/rss
     plugin_rss_limit: 4
-    plugin_tweets: yes
-    plugin_tweets_token: ${{ secrets.TWITTER_TOKEN }}
-    plugin_tweets_user: github
-    plugin_tweets_attachments: yes
-    plugin_tweets_limit: 2
     plugin_topics: yes
     plugin_topics_limit: 24
     plugin_isocalendar: yes
diff --git a/tests/cases/markdown.template.yml b/tests/cases/markdown.template.yml
index 003e5feea5c..76ce8a2f150 100644
--- a/tests/cases/markdown.template.yml
+++ b/tests/cases/markdown.template.yml
@@ -27,11 +27,6 @@
     plugin_rss: yes
     plugin_rss_source: https://news.ycombinator.com/rss
     plugin_rss_limit: 4
-    plugin_tweets: yes
-    plugin_tweets_token: MOCKED_TOKEN
-    plugin_tweets_user: github
-    plugin_tweets_attachments: yes
-    plugin_tweets_limit: 2
     plugin_topics: yes
     plugin_topics_limit: 24
     plugin_isocalendar: yes

From 956b0a78ce4d4082ca7811cbb329069276952a30 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 11 Sep 2023 20:36:55 -0400
Subject: [PATCH 164/196] fix: remove some loggers

---
 source/app/web/instance.mjs     | 2 +-
 source/plugins/habits/index.mjs | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/source/app/web/instance.mjs b/source/app/web/instance.mjs
index 19ff777b218..4b13c99565d 100644
--- a/source/app/web/instance.mjs
+++ b/source/app/web/instance.mjs
@@ -538,7 +538,7 @@ export default async function({sandbox = false} = {}) {
   //Control endpoints
   if (conf.settings.control?.token) {
     const middleware = (req, res, next) => {
-      console.log(`metrics/app/control > ${req.url.replace(/[\n\r]/g, "")}`)
+      console.debug(`metrics/app/control > ${req.url.replace(/[\n\r]/g, "")}`)
       if (req.headers.authorization === conf.settings.control.token) {
         next()
         return
diff --git a/source/plugins/habits/index.mjs b/source/plugins/habits/index.mjs
index 2c2fea62635..3a1a437d602 100644
--- a/source/plugins/habits/index.mjs
+++ b/source/plugins/habits/index.mjs
@@ -128,7 +128,6 @@ export default async function({login, data, rest, imports, q, account}, {enabled
         const height = 160
         if (type === "line")
           return imports.Graph.line(Object.entries(data).map(([x, y]) => ({x: +x, y})), {low, high, ticks, labels, width, height})
-        console.log(data)
         if (type === "pie")
           return imports.Graph.pie(data, {colors, width, height})
         return ""

From 87081009b4d371d1c05754abb81a3843ff388f13 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 11 Sep 2023 20:54:45 -0400
Subject: [PATCH 165/196] fix(app/utils): pie graph when less than 3 values

Needs to handle more than X values in the future, `d3.schemeSpectral` is not infinite
---
 source/app/metrics/utils.mjs | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/source/app/metrics/utils.mjs b/source/app/metrics/utils.mjs
index 451052804ad..f210b9e8f10 100644
--- a/source/app/metrics/utils.mjs
+++ b/source/app/metrics/utils.mjs
@@ -959,8 +959,14 @@ export const Graph = {
     const V = Object.values(data)
     const I = d3.range(K.length).filter(i => !Number.isNaN(V[i]))
 
+    //Colors
+    const spectral = [...d3.schemeSpectral]
+    spectral[0] = ["#000000"]
+    spectral[1] = spectral[3].slice(0, 1)
+    spectral[2] = spectral[3].slice(0, 2)
+
     //Construct arcs
-    const color = d3.scaleOrdinal(K, d3.schemeSpectral[K.length])
+    const color = d3.scaleOrdinal(K, spectral[K.length])
     const arcs = d3.pie().padAngle(1 / radius).sort(null).value(i => V[i])(I)
     const arc = d3.arc().innerRadius(0).outerRadius(radius)
     const labels = d3.arc().innerRadius(radius / 2).outerRadius(radius / 2)

From d4d0137ac053c70c61b86bc16c36295a3258835c Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 11 Sep 2023 21:23:42 -0400
Subject: [PATCH 166/196] chore(deps): upgrade

---
 package-lock.json | 88 +++++++++++++++++++++++------------------------
 package.json      | 10 +++---
 2 files changed, 49 insertions(+), 49 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index e01cbeac5ad..73a0f007c04 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,15 +10,15 @@
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
-        "@actions/core": "^1.10.0",
+        "@actions/core": "^1.10.1",
         "@actions/github": "^5.1.1",
         "@faker-js/faker": "^8.0.2",
         "@octokit/graphql": "^7.0.1",
         "@octokit/rest": "^20.0.1",
         "@primer/css": "^21.0.8",
-        "@primer/octicons": "^19.6.0",
+        "@primer/octicons": "^19.7.0",
         "@twemoji/parser": "^14.1.0",
-        "axios": "^1.4.0",
+        "axios": "^1.5.0",
         "clipboard": "^2.0.11",
         "compression": "^1.7.4",
         "csso": "^5.0.5",
@@ -26,7 +26,7 @@
         "ejs": "^3.1.9",
         "emoji-name-map": "^1.2.9",
         "express": "^4.18.2",
-        "express-rate-limit": "^6.9.0",
+        "express-rate-limit": "^6.11.1",
         "file-type": "^18.5.0",
         "js-yaml": "^4.1.0",
         "jsdom": "^22.1.0",
@@ -37,7 +37,7 @@
         "open-graph-scraper": "^6.2.2",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^21.1.0",
+        "puppeteer": "^21.1.1",
         "purgecss": "^5.0.0",
         "rss-parser": "^3.13.0",
         "sanitize-html": "^2.11.0",
@@ -73,9 +73,9 @@
       }
     },
     "node_modules/@actions/core": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
-      "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==",
+      "version": "1.10.1",
+      "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz",
+      "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==",
       "dependencies": {
         "@actions/http-client": "^2.0.1",
         "uuid": "^8.3.2"
@@ -2007,9 +2007,9 @@
       }
     },
     "node_modules/@primer/octicons": {
-      "version": "19.6.0",
-      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.6.0.tgz",
-      "integrity": "sha512-/10tz0hyJijS9hCLKw5Wb3LfRmVSQjtiUDPfvf582bhe+/xZDybgf3VLJncD5SZaetC4zNhz31VwV8nnG2PdSQ==",
+      "version": "19.7.0",
+      "resolved": "https://registry.npmjs.org/@primer/octicons/-/octicons-19.7.0.tgz",
+      "integrity": "sha512-24lel5MYOTXXdm2VPKAT2JIAJU7rnirVfa/1HGBjTvLdUpk789Lz/QA4o7klYhVdjIJW0rw5nOmU+bWSmfuNwg==",
       "dependencies": {
         "object-assign": "^4.1.1"
       }
@@ -2487,9 +2487,9 @@
       "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "node_modules/axios": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz",
-      "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==",
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz",
+      "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==",
       "dependencies": {
         "follow-redirects": "^1.15.0",
         "form-data": "^4.0.0",
@@ -2990,9 +2990,9 @@
       }
     },
     "node_modules/chromium-bidi": {
-      "version": "0.4.20",
-      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.20.tgz",
-      "integrity": "sha512-ruHgVZFEv00mAQMz1tQjfjdG63jiPWrQPF6HLlX2ucqLqVTJoWngeBEKHaJ6n1swV/HSvgnBNbtTRIlcVyW3Fw==",
+      "version": "0.4.22",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.22.tgz",
+      "integrity": "sha512-wR7Y9Ioez+cNXT4ZP7VNM1HRTljpNnMSLw4/RnwhhZUP4yCU7kIQND00YiktuHekch68jklGPK1q9Jkb29+fQg==",
       "dependencies": {
         "mitt": "3.0.1"
       },
@@ -4441,11 +4441,11 @@
       }
     },
     "node_modules/express-rate-limit": {
-      "version": "6.9.0",
-      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.9.0.tgz",
-      "integrity": "sha512-AnISR3V8qy4gpKM62/TzYdoFO9NV84fBx0POXzTryHU/qGUJBWuVGd+JhbvtVmKBv37t8/afmqdnv16xWoQxag==",
+      "version": "6.11.1",
+      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.1.tgz",
+      "integrity": "sha512-8+UpWtQY25lJaa4+3WxDBGDcAu4atcTruSs3QSL5VPEplYy6kmk84wutG9rUkkK5LmMQQ7TFHWLZYITwVNbbEg==",
       "engines": {
-        "node": ">= 14.0.0"
+        "node": ">= 14"
       },
       "peerDependencies": {
         "express": "^4 || ^5"
@@ -6927,18 +6927,18 @@
       }
     },
     "node_modules/pac-proxy-agent": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.0.tgz",
-      "integrity": "sha512-t4tRAMx0uphnZrio0S0Jw9zg3oDbz1zVhQ/Vy18FjLfP1XOLNUEjaVxYCYRI6NS+BsMBXKIzV6cTLOkO9AtywA==",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz",
+      "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==",
       "dependencies": {
         "@tootallnate/quickjs-emscripten": "^0.23.0",
         "agent-base": "^7.0.2",
         "debug": "^4.3.4",
         "get-uri": "^6.0.1",
         "http-proxy-agent": "^7.0.0",
-        "https-proxy-agent": "^7.0.0",
+        "https-proxy-agent": "^7.0.2",
         "pac-resolver": "^7.0.0",
-        "socks-proxy-agent": "^8.0.1"
+        "socks-proxy-agent": "^8.0.2"
       },
       "engines": {
         "node": ">= 14"
@@ -6984,9 +6984,9 @@
       }
     },
     "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz",
-      "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==",
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
+      "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
       "dependencies": {
         "agent-base": "^7.0.2",
         "debug": "4"
@@ -7513,9 +7513,9 @@
       }
     },
     "node_modules/proxy-agent/node_modules/https-proxy-agent": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.1.tgz",
-      "integrity": "sha512-Eun8zV0kcYS1g19r78osiQLEFIRspRUDd9tIfBCTBPBeMieF/EsJNL8VI3xOIdYRDEkjQnqOYPsZ2DsWsVsFwQ==",
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
+      "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
       "dependencies": {
         "agent-base": "^7.0.2",
         "debug": "4"
@@ -7565,26 +7565,26 @@
       }
     },
     "node_modules/puppeteer": {
-      "version": "21.1.0",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.1.0.tgz",
-      "integrity": "sha512-x0KfxVd7Hsefq8nzH1AAdSnYw5HEKI4QPeexBmx7nO29jDoEKNE+75G8zQ0E57ZOny/vAZZptCFdD3A7PkeESQ==",
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.1.1.tgz",
+      "integrity": "sha512-2TLntjGA4qLrI9/8N0UK/5OoZJ2Ue7QgphN2SD+RsaHiha12AEiVyMGsB+i6LY1IoPAtEgYIjblQ7lw3kWDNRw==",
       "hasInstallScript": true,
       "dependencies": {
         "@puppeteer/browsers": "1.7.0",
         "cosmiconfig": "8.2.0",
-        "puppeteer-core": "21.1.0"
+        "puppeteer-core": "21.1.1"
       },
       "engines": {
         "node": ">=16.3.0"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "21.1.0",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.1.0.tgz",
-      "integrity": "sha512-ggfTj09jo81Y6M4DyNj80GrY6Pip+AtDUgGljqoSzP6FG5nz5Aju6Cs/X147fLgkJ4UKTb736U6cDp0ssLzN5Q==",
+      "version": "21.1.1",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.1.1.tgz",
+      "integrity": "sha512-Tlcajcf44zwfa9Sbwv3T8BtaNMJ69wtpHIxwl2NOBTyTK3D1wppQovXTjfw0TDOm3a16eCfQ+5BMi3vRQ4kuAQ==",
       "dependencies": {
         "@puppeteer/browsers": "1.7.0",
-        "chromium-bidi": "0.4.20",
+        "chromium-bidi": "0.4.22",
         "cross-fetch": "4.0.0",
         "debug": "4.3.4",
         "devtools-protocol": "0.0.1159816",
@@ -8394,11 +8394,11 @@
       }
     },
     "node_modules/socks-proxy-agent": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz",
-      "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==",
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz",
+      "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==",
       "dependencies": {
-        "agent-base": "^7.0.1",
+        "agent-base": "^7.0.2",
         "debug": "^4.3.4",
         "socks": "^2.7.1"
       },
diff --git a/package.json b/package.json
index f35c4ef05c5..72e6fa44c2a 100644
--- a/package.json
+++ b/package.json
@@ -29,15 +29,15 @@
   },
   "homepage": "https://github.com/lowlighter/metrics#readme",
   "dependencies": {
-    "@actions/core": "^1.10.0",
+    "@actions/core": "^1.10.1",
     "@actions/github": "^5.1.1",
     "@faker-js/faker": "^8.0.2",
     "@octokit/graphql": "^7.0.1",
     "@octokit/rest": "^20.0.1",
     "@primer/css": "^21.0.8",
-    "@primer/octicons": "^19.6.0",
+    "@primer/octicons": "^19.7.0",
     "@twemoji/parser": "^14.1.0",
-    "axios": "^1.4.0",
+    "axios": "^1.5.0",
     "clipboard": "^2.0.11",
     "compression": "^1.7.4",
     "csso": "^5.0.5",
@@ -45,7 +45,7 @@
     "ejs": "^3.1.9",
     "emoji-name-map": "^1.2.9",
     "express": "^4.18.2",
-    "express-rate-limit": "^6.9.0",
+    "express-rate-limit": "^6.11.1",
     "file-type": "^18.5.0",
     "js-yaml": "^4.1.0",
     "jsdom": "^22.1.0",
@@ -56,7 +56,7 @@
     "open-graph-scraper": "^6.2.2",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^21.1.0",
+    "puppeteer": "^21.1.1",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.13.0",
     "sanitize-html": "^2.11.0",

From 2e12f12147626d424169820221b47e63965efe6b Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 12 Sep 2023 04:23:48 +0200
Subject: [PATCH 167/196] fix(plugin/achievements): use graphql first for
 initial setup and fix regex (#1532)

---
 source/plugins/achievements/index.mjs         | 61 ++++++++++++-------
 .../achievements/queries/total.graphql        | 11 ++++
 .../api/github/graphql/achievements.total.mjs |  9 +++
 3 files changed, 60 insertions(+), 21 deletions(-)
 create mode 100644 source/plugins/achievements/queries/total.graphql
 create mode 100644 tests/mocks/api/github/graphql/achievements.total.mjs

diff --git a/source/plugins/achievements/index.mjs b/source/plugins/achievements/index.mjs
index b950bc7eb66..0647d47cfe7 100644
--- a/source/plugins/achievements/index.mjs
+++ b/source/plugins/achievements/index.mjs
@@ -14,7 +14,7 @@ export default async function({login, q, imports, data, computed, graphql, queri
 
     //Initialization
     const list = []
-    await total({imports})
+    await total({imports, graphql, queries})
     await compute[account]({list, login, data, computed, imports, graphql, queries, rest, rank, leaderboard})
 
     //Results
@@ -72,31 +72,50 @@ function leaderboard({user, type, requirement}) {
 }
 
 /**Total extracter */
-async function total({imports}) {
+async function total({imports, graphql, queries}) {
   if (!total.promise) {
     total.promise = new Promise(async (solve, reject) => {
-      //Setup browser
-      console.debug("metrics/compute/plugins > achievements > filling total from github.com/search")
-      const browser = await imports.puppeteer.launch()
-      console.debug(`metrics/compute/plugins > achievements > started ${await browser.version()}`)
-      //Extracting total from github.com/search
-      for (let i = 0; (i < 100) && ((!total.users) || (!total.repositories)); i++) {
-        const page = await browser.newPage()
-        await page.goto("https://github.com/search?q=created%3A%3E%3D1970")
-        const results = await page.evaluate(() => [...[...document.querySelectorAll("h2")].filter(node => /Filter by/.test(node.innerText)).shift()?.nextSibling?.innerText.trim().matchAll(/(?<type>Repositories|Users|Issues)\n(?<count>.*?)M/g) ?? []]) ?? null
-        for (const result of results) {
-          const type = result[1]?.toLowerCase()
-          console.debug(`metrics/compute/plugins > achievements > setup found ${type ?? "(?)"}`)
-          const count = result[2] ?? ""
-          if ((count !== "") && (!total[type])) {
-            total[type] = Number(count) * 10e5
-            console.debug(`metrics/compute/plugins > achievements > set total.${type} to ${total[type]}`)
+      for (const method of ["graphql", "browser"]) {
+        console.debug(`metrics/compute/plugins > achievements > setup using ${method}`)
+        try {
+          //Setup using GraphQL
+          if (method === "graphql") {
+            const queried = await graphql(queries.achievements.total())
+            Object.assign(total, Object.fromEntries(Object.entries(queried).map(([key, {count:value}]) => [key, value])))
           }
+          //Setup using browser
+          if (method === "browser") {
+            //Setup browser
+            console.debug("metrics/compute/plugins > achievements > filling total from github.com/search")
+            const browser = await imports.puppeteer.launch()
+            console.debug(`metrics/compute/plugins > achievements > started ${await browser.version()}`)
+            //Extracting total from github.com/search
+            for (let i = 0; (i < 4) && ((!total.users) || (!total.repositories)); i++) {
+              const page = await browser.newPage()
+              await page.goto("https://github.com/search?q=created%3A%3E%3D1970")
+              const results = await page.evaluate(() => [...[...document.querySelectorAll("h2")].filter(node => /Filter by/.test(node.innerText)).shift()?.nextSibling?.innerText.trim().matchAll(/(?<type>Repositories|Users|Issues)\n.*?(?<count>\d+)M/g) ?? []]) ?? null
+              for (const result of results) {
+                const type = result[1]?.toLowerCase()
+                console.debug(`metrics/compute/plugins > achievements > setup found ${type ?? "(?)"}`)
+                const count = result[2] ?? ""
+                if ((count !== "") && (!total[type])) {
+                  total[type] = Number(count) * 10e5
+                  console.debug(`metrics/compute/plugins > achievements > set total.${type} to ${total[type]}`)
+                }
+              }
+              await page.close()
+              await imports.wait(10 * Math.random())
+            }
+          }
+          //Check setup state
+          if ((!total.users) || (!total.repositories))
+            throw new Error("Uncomplete setup")
+        }
+        catch (error) {
+          console.debug(`metrics/compute/plugins > achievements > setup error > ${error}`)
+          continue
         }
-        await page.close()
-        await imports.wait(10 * Math.random())
       }
-      //Check setup state
       if ((!total.users) || (!total.repositories))
         return reject("Failed to initiate total for achievement plugin")
       console.debug("metrics/compute/plugins > achievements > total setup complete")
diff --git a/source/plugins/achievements/queries/total.graphql b/source/plugins/achievements/queries/total.graphql
new file mode 100644
index 00000000000..95b00bfbda8
--- /dev/null
+++ b/source/plugins/achievements/queries/total.graphql
@@ -0,0 +1,11 @@
+query AchievementsTotal {
+  issues:search(query: "created:>1970", type: ISSUE) {
+    count:issueCount
+  }
+  repositories:search(query: "created:>1970", type: REPOSITORY) {
+    count:repositoryCount
+  }
+  users:search(query: "created:>1970", type: USER) {
+    count:userCount
+  }
+}
diff --git a/tests/mocks/api/github/graphql/achievements.total.mjs b/tests/mocks/api/github/graphql/achievements.total.mjs
new file mode 100644
index 00000000000..f56fa976d83
--- /dev/null
+++ b/tests/mocks/api/github/graphql/achievements.total.mjs
@@ -0,0 +1,9 @@
+/**Mocked data */
+export default function({faker, query, login = faker.internet.userName()}) {
+  console.debug("metrics/compute/mocks > mocking graphql api result > achievements/total")
+  return ({
+    repositories: {count: faker.number.int(100000)},
+    issues: {count: faker.number.int(100000)},
+    users: {count: faker.number.int(100000)},
+  })
+}

From fc8615fafe42c6fd5ff1d5eed924d11598a75b85 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 12 Sep 2023 02:57:49 +0000
Subject: [PATCH 168/196] chore: code formatting

---
 source/plugins/achievements/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/achievements/index.mjs b/source/plugins/achievements/index.mjs
index 0647d47cfe7..d0080aabf52 100644
--- a/source/plugins/achievements/index.mjs
+++ b/source/plugins/achievements/index.mjs
@@ -81,7 +81,7 @@ async function total({imports, graphql, queries}) {
           //Setup using GraphQL
           if (method === "graphql") {
             const queried = await graphql(queries.achievements.total())
-            Object.assign(total, Object.fromEntries(Object.entries(queried).map(([key, {count:value}]) => [key, value])))
+            Object.assign(total, Object.fromEntries(Object.entries(queried).map(([key, {count: value}]) => [key, value])))
           }
           //Setup using browser
           if (method === "browser") {

From 8b410f24de5c1f463ac385d29286baccff29f292 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 12 Sep 2023 05:06:46 +0200
Subject: [PATCH 169/196] chore(deps): bump eslint from 8.47.0 to 8.49.0
 (#1528) [skip ci]

---
 package-lock.json | 24 ++++++++++++------------
 package.json      |  2 +-
 2 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 73a0f007c04..d173a548a6a 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,7 +50,7 @@
       },
       "devDependencies": {
         "dprint": "^0.40.2",
-        "eslint": "^8.47.0",
+        "eslint": "^8.49.0",
         "jest": "^29.6.3"
       },
       "optionalDependencies": {
@@ -967,9 +967,9 @@
       "dev": true
     },
     "node_modules/@eslint/js": {
-      "version": "8.47.0",
-      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz",
-      "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==",
+      "version": "8.49.0",
+      "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz",
+      "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==",
       "dev": true,
       "engines": {
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@@ -1084,9 +1084,9 @@
       }
     },
     "node_modules/@humanwhocodes/config-array": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz",
-      "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==",
+      "version": "0.11.11",
+      "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
+      "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
       "dev": true,
       "dependencies": {
         "@humanwhocodes/object-schema": "^1.2.1",
@@ -4140,16 +4140,16 @@
       }
     },
     "node_modules/eslint": {
-      "version": "8.47.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz",
-      "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==",
+      "version": "8.49.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz",
+      "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==",
       "dev": true,
       "dependencies": {
         "@eslint-community/eslint-utils": "^4.2.0",
         "@eslint-community/regexpp": "^4.6.1",
         "@eslint/eslintrc": "^2.1.2",
-        "@eslint/js": "^8.47.0",
-        "@humanwhocodes/config-array": "^0.11.10",
+        "@eslint/js": "8.49.0",
+        "@humanwhocodes/config-array": "^0.11.11",
         "@humanwhocodes/module-importer": "^1.0.1",
         "@nodelib/fs.walk": "^1.2.8",
         "ajv": "^6.12.4",
diff --git a/package.json b/package.json
index 72e6fa44c2a..98be4862c30 100644
--- a/package.json
+++ b/package.json
@@ -69,7 +69,7 @@
   },
   "devDependencies": {
     "dprint": "^0.40.2",
-    "eslint": "^8.47.0",
+    "eslint": "^8.49.0",
     "jest": "^29.6.3"
   },
   "jest": {

From 53f4cb6920a16984c086f8f17af7083321464dea Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 12 Sep 2023 05:07:57 +0200
Subject: [PATCH 170/196] feat(plugins/lines): add `plugin_lines_delay` to
 mitigate first query results (#1530)

---
 source/plugins/lines/index.mjs     | 15 +++++++++++----
 source/plugins/lines/metadata.yml  | 14 ++++++++++++++
 source/templates/classic/style.css |  2 +-
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/source/plugins/lines/index.mjs b/source/plugins/lines/index.mjs
index 1888c6ccd5c..fa0f35b218c 100644
--- a/source/plugins/lines/index.mjs
+++ b/source/plugins/lines/index.mjs
@@ -7,7 +7,7 @@ export default async function({login, data, imports, rest, q, account}, {enabled
       return null
 
     //Load inputs
-    let {skipped, sections, "repositories.limit": _repositories_limit, "history.limit": _history_limit} = imports.metadata.plugins.lines.inputs({data, account, q})
+    let {skipped, sections, "repositories.limit": _repositories_limit, "history.limit": _history_limit, delay} = imports.metadata.plugins.lines.inputs({data, account, q})
     skipped.push(...data.shared["repositories.skipped"])
 
     //Context
@@ -25,9 +25,16 @@ export default async function({login, data, imports, rest, q, account}, {enabled
     //Get contributors stats from repositories
     console.debug(`metrics/compute/${login}/plugins > lines > querying api`)
     const repos = {}, weeks = {}
-    const response = [...await Promise.allSettled(repositories.map(async ({repo, owner}) => imports.filters.repo(`${owner}/${repo}`, skipped) ? {handle: `${owner}/${repo}`, stats: (await rest.repos.getContributorsStats({owner, repo})).data} : {}))].filter(({status}) => status === "fulfilled").map((
-      {value},
-    ) => value)
+    let response = []
+    for (let i = 0; i < (delay ? 2 : 1); i++) {
+      response = [...await Promise.allSettled(repositories.map(async ({repo, owner}) => imports.filters.repo(`${owner}/${repo}`, skipped) ? {handle: `${owner}/${repo}`, stats: (await rest.repos.getContributorsStats({owner, repo})).data} : {}))].filter(({status}) => status === "fulfilled").map((
+        {value},
+      ) => value)
+      if (delay) {
+        console.debug(`metrics/compute/${login}/plugins > lines > waiting ${delay}s while waiting for contributor stats to be updated`)
+        await new Promise(resolve => setTimeout(resolve, delay*1000))
+      }
+    }
 
     //Compute changed lines
     console.debug(`metrics/compute/${login}/plugins > lines > computing total diff`)
diff --git a/source/plugins/lines/metadata.yml b/source/plugins/lines/metadata.yml
index ace65be538e..68dfd223e13 100644
--- a/source/plugins/lines/metadata.yml
+++ b/source/plugins/lines/metadata.yml
@@ -63,4 +63,18 @@ inputs:
       Will display the last `n` years, relative to current year
     type: number
     default: 1
+    zero: disable
+
+  plugin_lines_delay:
+    description: |
+      Delay before performing a second query
+
+      When non-zero, will perform a second query after specified delay (in seconds).
+      The GitHub endpoint used may return inaccurate results on first query (these values seems to be cached on the fly),
+      after returning correct results upon performing another query.
+
+      Using this option may mitigate the occurrence of weird values.
+    type: number
+    default: 0
+    min: 0
     zero: disable
\ No newline at end of file
diff --git a/source/templates/classic/style.css b/source/templates/classic/style.css
index 441efa65758..f4b8e51ada4 100644
--- a/source/templates/classic/style.css
+++ b/source/templates/classic/style.css
@@ -891,7 +891,7 @@
     font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;
     font-weight: bold;
     font-size: 12px;
-    white-space: pre;
+    white-space: nowrap;
   }
   .added {
     color: rgb(63, 185, 80);

From e0729b29f4d708aa7a52a70eea4703b82a9ea35a Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 12 Sep 2023 03:39:49 +0000
Subject: [PATCH 171/196] chore: code formatting

---
 source/plugins/lines/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/lines/index.mjs b/source/plugins/lines/index.mjs
index fa0f35b218c..c77e7d3a6c2 100644
--- a/source/plugins/lines/index.mjs
+++ b/source/plugins/lines/index.mjs
@@ -32,7 +32,7 @@ export default async function({login, data, imports, rest, q, account}, {enabled
       ) => value)
       if (delay) {
         console.debug(`metrics/compute/${login}/plugins > lines > waiting ${delay}s while waiting for contributor stats to be updated`)
-        await new Promise(resolve => setTimeout(resolve, delay*1000))
+        await new Promise(resolve => setTimeout(resolve, delay * 1000))
       }
     }
 

From 07496114521ce9d311f4640b1a5bdc10adccddbc Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 12 Sep 2023 03:40:36 +0000
Subject: [PATCH 172/196] ci: auto-regenerate files

---
 README.md                      |  2 +-
 action.yml                     |  4 ++++
 source/plugins/lines/README.md | 18 ++++++++++++++++++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 139e0e01d80..2fe2fc95d6e 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
   </tr>
   <tr>
     <th colspan="2" align="center">
-      <h3><a href="/README.md#-plugins">🧩 Customizable with 46 plugins and 329 options!</a></h3>
+      <h3><a href="/README.md#-plugins">🧩 Customizable with 46 plugins and 330 options!</a></h3>
     </th>
   </tr>
   <tr>
diff --git a/action.yml b/action.yml
index d35035dc757..ba2ab546ff5 100644
--- a/action.yml
+++ b/action.yml
@@ -395,6 +395,10 @@ inputs:
     description: Years to display
     default: <default-value>
 
+  plugin_lines_delay:
+    description: Delay before performing a second query
+    default: <default-value>
+
   # ====================================================================================
   # 📌 Starred topics
 
diff --git a/source/plugins/lines/README.md b/source/plugins/lines/README.md
index 1271e38e4e7..475f54cc921 100644
--- a/source/plugins/lines/README.md
+++ b/source/plugins/lines/README.md
@@ -99,6 +99,24 @@ All product and company names are trademarks™ or registered® trademarks of th
 <b>zero behaviour:</b> disable</br>
 <b>default:</b> 1<br></td>
   </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_lines_delay</code></h4></td>
+    <td rowspan="2"><p>Delay before performing a second query</p>
+<p>When non-zero, will perform a second query after specified delay (in seconds).
+The GitHub endpoint used may return inaccurate results on first query (these values seems to be cached on the fly),
+after returning correct results upon performing another query.</p>
+<p>Using this option may mitigate the occurrence of weird values.</p>
+<img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
+<b>type:</b> <code>number</code>
+<i>(0 ≤
+𝑥)</i>
+<br>
+<b>zero behaviour:</b> disable</br>
+<b>default:</b> 0<br></td>
+  </tr>
 </table>
 <!--/options-->
 

From 52459b822ac946ed235c11ff307f948d19fca3fe Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 12 Sep 2023 13:04:47 -0400
Subject: [PATCH 173/196] ci: update examples for lines [skip ci]

---
 .github/workflows/examples.yml    | 2 ++
 source/plugins/lines/README.md    | 2 ++
 source/plugins/lines/examples.yml | 2 ++
 tests/cases/lines.plugin.yml      | 2 ++
 4 files changed, 8 insertions(+)

diff --git a/.github/workflows/examples.yml b/.github/workflows/examples.yml
index 38b5f6e2956..b391f4a7544 100644
--- a/.github/workflows/examples.yml
+++ b/.github/workflows/examples.yml
@@ -270,6 +270,7 @@ jobs:
           token: ${{ secrets.METRICS_TOKEN }}
           base: repositories
           plugin_lines: yes
+          plugin_lines_delay: 30
           output_action: none
           delay: 120
           user: lowlighter
@@ -282,6 +283,7 @@ jobs:
           token: ${{ secrets.METRICS_TOKEN }}
           base: ""
           plugin_lines: yes
+          plugin_lines_delay: 30
           plugin_lines_sections: repositories, history
           plugin_lines_repositories_limit: 2
           plugin_lines_history_limit: 1
diff --git a/source/plugins/lines/README.md b/source/plugins/lines/README.md
index 475f54cc921..8eb97ad1a76 100644
--- a/source/plugins/lines/README.md
+++ b/source/plugins/lines/README.md
@@ -131,6 +131,7 @@ with:
   token: ${{ secrets.METRICS_TOKEN }}
   base: repositories
   plugin_lines: yes
+  plugin_lines_delay: 30
 
 ```
 ```yaml
@@ -141,6 +142,7 @@ with:
   token: ${{ secrets.METRICS_TOKEN }}
   base: ""
   plugin_lines: yes
+  plugin_lines_delay: 30
   plugin_lines_sections: repositories, history
   plugin_lines_repositories_limit: 2
   plugin_lines_history_limit: 1
diff --git a/source/plugins/lines/examples.yml b/source/plugins/lines/examples.yml
index b2afeb1f303..85bf859df90 100644
--- a/source/plugins/lines/examples.yml
+++ b/source/plugins/lines/examples.yml
@@ -5,6 +5,7 @@
     token: ${{ secrets.METRICS_TOKEN }}
     base: repositories
     plugin_lines: yes
+    plugin_lines_delay: 30
 
 - name: Repositories and diff history
   uses: lowlighter/metrics@latest
@@ -13,6 +14,7 @@
     token: ${{ secrets.METRICS_TOKEN }}
     base: ""
     plugin_lines: yes
+    plugin_lines_delay: 30
     plugin_lines_sections: repositories, history
     plugin_lines_repositories_limit: 2
     plugin_lines_history_limit: 1
diff --git a/tests/cases/lines.plugin.yml b/tests/cases/lines.plugin.yml
index 3c684a5a8ac..5184c294f02 100644
--- a/tests/cases/lines.plugin.yml
+++ b/tests/cases/lines.plugin.yml
@@ -4,6 +4,7 @@
     token: MOCKED_TOKEN
     base: repositories
     plugin_lines: 'yes'
+    plugin_lines_delay: 30
     use_mocked_data: 'yes'
     verify: 'yes'
 - name: 👨‍💻 Lines of code changed - Repositories and diff history
@@ -11,6 +12,7 @@
   with:
     token: MOCKED_TOKEN
     plugin_lines: 'yes'
+    plugin_lines_delay: 30
     plugin_lines_sections: repositories, history
     plugin_lines_repositories_limit: 2
     plugin_lines_history_limit: 1

From 1c4c9faed041a2be0878b006cbd14557fdc68ae8 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 12 Sep 2023 19:05:03 +0200
Subject: [PATCH 174/196] chore: prepare release v3.34 (#1531) [skip ci]

---
 package-lock.json | 4 ++--
 package.json      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index d173a548a6a..9f5ba74e6e2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "metrics",
-  "version": "3.34.0-beta",
+  "version": "3.34.0",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "metrics",
-      "version": "3.34.0-beta",
+      "version": "3.34.0",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index 98be4862c30..e269102c33d 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "metrics",
-  "version": "3.34.0-beta",
+  "version": "3.34.0",
   "description": "An infographics generator with 40+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!",
   "main": "index.mjs",
   "scripts": {

From f03795a32377e70c5e0083cd23772ae2fe57cbc7 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 12 Sep 2023 13:05:45 -0400
Subject: [PATCH 175/196] Update README.md

---
 README.md | 2 --
 1 file changed, 2 deletions(-)

diff --git a/README.md b/README.md
index 2fe2fc95d6e..f2a09a83a94 100644
--- a/README.md
+++ b/README.md
@@ -436,8 +436,6 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
 # 📚 Documentation
 
 
-> <sup>*⚠️ This is the documentation of **v3.34-beta** (`@master`/`@main` branches) which includes [unreleased features](https://github.com/lowlighter/metrics/compare/latest...master) planned for next release. See documentation for current released version [**v3.33** (`@latest` branch) here](https://github.com/lowlighter/metrics/blob/latest/README.md).* </sup>
-
 
 
 ## 🦮 Setup

From b53107d5cea583f38c40809051f606db19a2a4cf Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 12 Sep 2023 13:05:56 -0400
Subject: [PATCH 176/196] Release v3.34 [release]


From 54d67ecbab2ac1493266fdce24b7187d3506366c Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 12 Sep 2023 17:41:50 -0400
Subject: [PATCH 177/196] fix(plugins/lines): don't wait twice

---
 source/plugins/lines/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/lines/index.mjs b/source/plugins/lines/index.mjs
index c77e7d3a6c2..0cc8db89cdc 100644
--- a/source/plugins/lines/index.mjs
+++ b/source/plugins/lines/index.mjs
@@ -30,7 +30,7 @@ export default async function({login, data, imports, rest, q, account}, {enabled
       response = [...await Promise.allSettled(repositories.map(async ({repo, owner}) => imports.filters.repo(`${owner}/${repo}`, skipped) ? {handle: `${owner}/${repo}`, stats: (await rest.repos.getContributorsStats({owner, repo})).data} : {}))].filter(({status}) => status === "fulfilled").map((
         {value},
       ) => value)
-      if (delay) {
+      if ((delay)&&(!i)) {
         console.debug(`metrics/compute/${login}/plugins > lines > waiting ${delay}s while waiting for contributor stats to be updated`)
         await new Promise(resolve => setTimeout(resolve, delay * 1000))
       }

From 14179f2d8857c4a011fb3572b18bf524c68b5b1a Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 12 Sep 2023 17:41:58 -0400
Subject: [PATCH 178/196] Release v3.34 [release]


From 65836723097537a54cd8eb90f61839426b4266b6 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 12 Sep 2023 22:27:42 +0000
Subject: [PATCH 179/196] chore: code formatting

---
 source/plugins/lines/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/lines/index.mjs b/source/plugins/lines/index.mjs
index 0cc8db89cdc..33000a75fcb 100644
--- a/source/plugins/lines/index.mjs
+++ b/source/plugins/lines/index.mjs
@@ -30,7 +30,7 @@ export default async function({login, data, imports, rest, q, account}, {enabled
       response = [...await Promise.allSettled(repositories.map(async ({repo, owner}) => imports.filters.repo(`${owner}/${repo}`, skipped) ? {handle: `${owner}/${repo}`, stats: (await rest.repos.getContributorsStats({owner, repo})).data} : {}))].filter(({status}) => status === "fulfilled").map((
         {value},
       ) => value)
-      if ((delay)&&(!i)) {
+      if ((delay) && (!i)) {
         console.debug(`metrics/compute/${login}/plugins > lines > waiting ${delay}s while waiting for contributor stats to be updated`)
         await new Promise(resolve => setTimeout(resolve, delay * 1000))
       }

From c69b0e9190be3405cfefaa39ca903d279e7f5324 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 14 Sep 2023 05:06:10 +0200
Subject: [PATCH 180/196] chore: create version 3.35-beta

---
 package-lock.json | 4 ++--
 package.json      | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 9f5ba74e6e2..26952a885a2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
 {
   "name": "metrics",
-  "version": "3.34.0",
+  "version": "3.35.0-beta",
   "lockfileVersion": 3,
   "requires": true,
   "packages": {
     "": {
       "name": "metrics",
-      "version": "3.34.0",
+      "version": "3.35.0-beta",
       "hasInstallScript": true,
       "license": "MIT",
       "dependencies": {
diff --git a/package.json b/package.json
index e269102c33d..d35f8b5412b 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "metrics",
-  "version": "3.34.0",
+  "version": "3.35.0-beta",
   "description": "An infographics generator with 40+ plugins and 300+ options to display stats about your GitHub account and render them as SVG, Markdown, PDF or JSON!",
   "main": "index.mjs",
   "scripts": {

From 47746add1e7d53352ddf9750424c0632714cd9f1 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 14 Sep 2023 05:06:30 +0200
Subject: [PATCH 181/196] fix(ci): potential security vulnerabilities

---
 .github/workflows/ci.yml   | 8 ++++++--
 .github/workflows/test.yml | 8 ++++++--
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 321efc0224e..5428dd7123f 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -184,9 +184,13 @@ jobs:
       - name: Pull docker image (master)
         run: docker pull ghcr.io/lowlighter/metrics:master
       - name: Tag docker image (release)
-        run: docker tag ghcr.io/lowlighter/metrics:master ghcr.io/lowlighter/metrics:$(echo '${{ github.event.head_commit.message }}' | grep -Po 'v\d+[.]\d+')
+        env:
+          GITHUB_COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
+        run: docker tag ghcr.io/lowlighter/metrics:master ghcr.io/lowlighter/metrics:$(echo $GITHUB_COMMIT_MESSAGE | grep -Po 'v\d+[.]\d+')
       - name: Publish release to GitHub registry
-        run: docker push ghcr.io/lowlighter/metrics:$(echo '${{ github.event.head_commit.message }}' | grep -Po 'v\d+[.]\d+')
+        env:
+          GITHUB_COMMIT_MESSAGE: ${{ github.event.head_commit.message }}
+        run: docker push ghcr.io/lowlighter/metrics:$(echo $GITHUB_COMMIT_MESSAGE | grep -Po 'v\d+[.]\d+')
       - name: Tag docker image (latest)
         run: docker tag ghcr.io/lowlighter/metrics:master ghcr.io/lowlighter/metrics:latest
       - name: Publish latest to GitHub registry
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 8ffb94b77cf..7c8a1bc18e3 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -43,9 +43,13 @@ jobs:
           mkdir -v -p /home/runner/.cache/dprint/cache
           npx dprint fmt --config .github/config/dprint.json
       - name: Build lowlighter/metrics:${{ github.head_ref || 'master' }}
-        run: docker build -t lowlighter/metrics:$(echo ${{ github.head_ref || 'master' }} | sed 's/\//-/g') .
+        env:
+          GIT_REF: ${{ github.head_ref || 'master' }}
+        run: docker build -t lowlighter/metrics:$(echo $GIT_REF | sed 's/[^a-z]/-/g') .
       - name: Run tests
-        run: docker run --rm --entrypoint="" lowlighter/metrics:$(echo ${{ github.head_ref || 'master' }} | sed 's/\//-/g') npm run test-metrics
+        env:
+          GIT_REF: ${{ github.head_ref || 'master' }}
+        run: docker run --rm --entrypoint="" lowlighter/metrics:$(echo $GIT_REF | sed 's/[^a-z]/-/g') npm run test-metrics
 
   # Run CodeQL on branch
   analyze:

From 2656eccd1bc398b30e0573ccaac0ce069c3d9657 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 14 Sep 2023 05:22:10 +0200
Subject: [PATCH 182/196] fix(plugins/core): empty scope listing

---
 source/plugins/core/index.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/plugins/core/index.mjs b/source/plugins/core/index.mjs
index 57c65261452..facfa176d45 100644
--- a/source/plugins/core/index.mjs
+++ b/source/plugins/core/index.mjs
@@ -125,7 +125,7 @@ export default async function({login, q}, {conf, data, rest, graphql, plugins, q
 
   //Token scopes
   try {
-    computed.token.scopes = conf.settings.notoken ? [] : (await rest.request("HEAD /")).headers["x-oauth-scopes"].split(", ")
+    computed.token.scopes = conf.settings.notoken ? [] : (await rest.request("HEAD /")).headers["x-oauth-scopes"]?.split(", ") ?? []
   }
   catch (error) {
     console.debug(error)

From 842cd274f6bcd03829288c1f162698792078937d Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 14 Sep 2023 05:49:19 +0200
Subject: [PATCH 183/196] chore(deps): upgrade

---
 package-lock.json | 814 ++++++++++++++++++++++++----------------------
 package.json      |  12 +-
 2 files changed, 427 insertions(+), 399 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 26952a885a2..2dd396bfb57 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,7 +15,7 @@
         "@faker-js/faker": "^8.0.2",
         "@octokit/graphql": "^7.0.1",
         "@octokit/rest": "^20.0.1",
-        "@primer/css": "^21.0.8",
+        "@primer/css": "^21.0.9",
         "@primer/octicons": "^19.7.0",
         "@twemoji/parser": "^14.1.0",
         "axios": "^1.5.0",
@@ -26,7 +26,7 @@
         "ejs": "^3.1.9",
         "emoji-name-map": "^1.2.9",
         "express": "^4.18.2",
-        "express-rate-limit": "^6.11.1",
+        "express-rate-limit": "^7.0.0",
         "file-type": "^18.5.0",
         "js-yaml": "^4.1.0",
         "jsdom": "^22.1.0",
@@ -37,7 +37,7 @@
         "open-graph-scraper": "^6.2.2",
         "png-js": "^1.0.0",
         "prismjs": "^1.29.0",
-        "puppeteer": "^21.1.1",
+        "puppeteer": "^21.2.1",
         "purgecss": "^5.0.0",
         "rss-parser": "^3.13.0",
         "sanitize-html": "^2.11.0",
@@ -49,12 +49,12 @@
         "xml-formatter": "^3.5.0"
       },
       "devDependencies": {
-        "dprint": "^0.40.2",
+        "dprint": "^0.41.0",
         "eslint": "^8.49.0",
-        "jest": "^29.6.3"
+        "jest": "^29.7.0"
       },
       "optionalDependencies": {
-        "@googlemaps/google-maps-services-js": "^3.3.36",
+        "@googlemaps/google-maps-services-js": "^3.3.38",
         "chess.js": "^1.0.0-beta.6",
         "color": "^4.2.3",
         "gifencoder": "^2.0.1",
@@ -114,11 +114,11 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "version": "7.22.10",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz",
-      "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==",
+      "version": "7.22.13",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
+      "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
       "dependencies": {
-        "@babel/highlight": "^7.22.10",
+        "@babel/highlight": "^7.22.13",
         "chalk": "^2.4.2"
       },
       "engines": {
@@ -199,21 +199,21 @@
       }
     },
     "node_modules/@babel/core": {
-      "version": "7.22.11",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.11.tgz",
-      "integrity": "sha512-lh7RJrtPdhibbxndr6/xx0w8+CVlY5FJZiaSz908Fpy+G0xkBFTvwLcKJFF4PJxVfGhVWNebikpWGnOoC71juQ==",
+      "version": "7.22.17",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz",
+      "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==",
       "dev": true,
       "dependencies": {
         "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.22.10",
-        "@babel/generator": "^7.22.10",
-        "@babel/helper-compilation-targets": "^7.22.10",
-        "@babel/helper-module-transforms": "^7.22.9",
-        "@babel/helpers": "^7.22.11",
-        "@babel/parser": "^7.22.11",
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.11",
-        "@babel/types": "^7.22.11",
+        "@babel/code-frame": "^7.22.13",
+        "@babel/generator": "^7.22.15",
+        "@babel/helper-compilation-targets": "^7.22.15",
+        "@babel/helper-module-transforms": "^7.22.17",
+        "@babel/helpers": "^7.22.15",
+        "@babel/parser": "^7.22.16",
+        "@babel/template": "^7.22.15",
+        "@babel/traverse": "^7.22.17",
+        "@babel/types": "^7.22.17",
         "convert-source-map": "^1.7.0",
         "debug": "^4.1.0",
         "gensync": "^1.0.0-beta.2",
@@ -267,12 +267,12 @@
       }
     },
     "node_modules/@babel/generator": {
-      "version": "7.22.10",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.10.tgz",
-      "integrity": "sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==",
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz",
+      "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.10",
+        "@babel/types": "^7.22.15",
         "@jridgewell/gen-mapping": "^0.3.2",
         "@jridgewell/trace-mapping": "^0.3.17",
         "jsesc": "^2.5.1"
@@ -282,13 +282,13 @@
       }
     },
     "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.22.10",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.10.tgz",
-      "integrity": "sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==",
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz",
+      "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==",
       "dev": true,
       "dependencies": {
         "@babel/compat-data": "^7.22.9",
-        "@babel/helper-validator-option": "^7.22.5",
+        "@babel/helper-validator-option": "^7.22.15",
         "browserslist": "^4.21.9",
         "lru-cache": "^5.1.1",
         "semver": "^6.3.1"
@@ -341,28 +341,28 @@
       }
     },
     "node_modules/@babel/helper-module-imports": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
-      "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+      "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
       "dev": true,
       "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/types": "^7.22.15"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-module-transforms": {
-      "version": "7.22.9",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz",
-      "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==",
+      "version": "7.22.17",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz",
+      "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==",
       "dev": true,
       "dependencies": {
         "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-module-imports": "^7.22.5",
+        "@babel/helper-module-imports": "^7.22.15",
         "@babel/helper-simple-access": "^7.22.5",
         "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/helper-validator-identifier": "^7.22.5"
+        "@babel/helper-validator-identifier": "^7.22.15"
       },
       "engines": {
         "node": ">=6.9.0"
@@ -414,40 +414,40 @@
       }
     },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
-      "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz",
+      "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helper-validator-option": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
-      "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz",
+      "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==",
       "dev": true,
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/helpers": {
-      "version": "7.22.11",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.11.tgz",
-      "integrity": "sha512-vyOXC8PBWaGc5h7GMsNx68OH33cypkEDJCHvYVVgVbbxJDROYVtexSk0gK5iCF1xNjRIN2s8ai7hwkWDq5szWg==",
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz",
+      "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==",
       "dev": true,
       "dependencies": {
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.11",
-        "@babel/types": "^7.22.11"
+        "@babel/template": "^7.22.15",
+        "@babel/traverse": "^7.22.15",
+        "@babel/types": "^7.22.15"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.22.10",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz",
-      "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==",
+      "version": "7.22.13",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz",
+      "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==",
       "dependencies": {
         "@babel/helper-validator-identifier": "^7.22.5",
         "chalk": "^2.4.2",
@@ -522,9 +522,9 @@
       }
     },
     "node_modules/@babel/parser": {
-      "version": "7.22.11",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.11.tgz",
-      "integrity": "sha512-R5zb8eJIBPJriQtbH/htEQy4k7E2dHWlD2Y2VT07JCzwYZHBxV5ZYtM0UhXSNMT74LyxuM+b1jdL7pSesXbC/g==",
+      "version": "7.22.16",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz",
+      "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==",
       "bin": {
         "parser": "bin/babel-parser.js"
       },
@@ -710,33 +710,33 @@
       }
     },
     "node_modules/@babel/template": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
-      "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+      "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
       "dev": true,
       "dependencies": {
-        "@babel/code-frame": "^7.22.5",
-        "@babel/parser": "^7.22.5",
-        "@babel/types": "^7.22.5"
+        "@babel/code-frame": "^7.22.13",
+        "@babel/parser": "^7.22.15",
+        "@babel/types": "^7.22.15"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/traverse": {
-      "version": "7.22.11",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.11.tgz",
-      "integrity": "sha512-mzAenteTfomcB7mfPtyi+4oe5BZ6MXxWcn4CX+h4IRJ+OOGXBrWU6jDQavkQI9Vuc5P+donFabBfFCcmWka9lQ==",
+      "version": "7.22.17",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz",
+      "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==",
       "dev": true,
       "dependencies": {
-        "@babel/code-frame": "^7.22.10",
-        "@babel/generator": "^7.22.10",
+        "@babel/code-frame": "^7.22.13",
+        "@babel/generator": "^7.22.15",
         "@babel/helper-environment-visitor": "^7.22.5",
         "@babel/helper-function-name": "^7.22.5",
         "@babel/helper-hoist-variables": "^7.22.5",
         "@babel/helper-split-export-declaration": "^7.22.6",
-        "@babel/parser": "^7.22.11",
-        "@babel/types": "^7.22.11",
+        "@babel/parser": "^7.22.16",
+        "@babel/types": "^7.22.17",
         "debug": "^4.1.0",
         "globals": "^11.1.0"
       },
@@ -777,13 +777,13 @@
       "dev": true
     },
     "node_modules/@babel/types": {
-      "version": "7.22.11",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.11.tgz",
-      "integrity": "sha512-siazHiGuZRz9aB9NpHy9GOs9xiQPKnMzgdr493iI1M67vRXpnEq8ZOOKzezC5q7zwuQ6sDhdSp4SD9ixKSqKZg==",
+      "version": "7.22.17",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz",
+      "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==",
       "dev": true,
       "dependencies": {
         "@babel/helper-string-parser": "^7.22.5",
-        "@babel/helper-validator-identifier": "^7.22.5",
+        "@babel/helper-validator-identifier": "^7.22.15",
         "to-fast-properties": "^2.0.0"
       },
       "engines": {
@@ -797,9 +797,9 @@
       "dev": true
     },
     "node_modules/@dprint/darwin-arm64": {
-      "version": "0.40.2",
-      "resolved": "https://registry.npmjs.org/@dprint/darwin-arm64/-/darwin-arm64-0.40.2.tgz",
-      "integrity": "sha512-qharMFhxpNq9brgvHLbqzzAgVgPWSHLfzNLwWWhKcGOUUDUIilfAo3SlvOz6w4nQiIifLpYZOvZqK7Lpf9mSSw==",
+      "version": "0.41.0",
+      "resolved": "https://registry.npmjs.org/@dprint/darwin-arm64/-/darwin-arm64-0.41.0.tgz",
+      "integrity": "sha512-P9PtcQI0mrI4U6yyd+/iI664BHSqC9KTS6ogq0ptEdnLtlaWzf09D1nv6FBaHiG9m3conuBRlPsoUqt3j6PZ2w==",
       "cpu": [
         "arm64"
       ],
@@ -810,9 +810,9 @@
       ]
     },
     "node_modules/@dprint/darwin-x64": {
-      "version": "0.40.2",
-      "resolved": "https://registry.npmjs.org/@dprint/darwin-x64/-/darwin-x64-0.40.2.tgz",
-      "integrity": "sha512-FPDdOTVr1JfqtLBTCvqlihWslTy3LBUoi3H1gaqIazCKMj2dB9voFWkBiMT+REMHDrlVsoSpFAfsliNr/y7HPA==",
+      "version": "0.41.0",
+      "resolved": "https://registry.npmjs.org/@dprint/darwin-x64/-/darwin-x64-0.41.0.tgz",
+      "integrity": "sha512-mSYnSoH0uyCkjgIWTny2DZAcaiRTe3kRWY5SeZECLGO37e+SdVg+ZjSzndhOvvEb9pv8EeBO1NJ9gHOSceT5Xw==",
       "cpu": [
         "x64"
       ],
@@ -823,9 +823,9 @@
       ]
     },
     "node_modules/@dprint/linux-arm64-glibc": {
-      "version": "0.40.2",
-      "resolved": "https://registry.npmjs.org/@dprint/linux-arm64-glibc/-/linux-arm64-glibc-0.40.2.tgz",
-      "integrity": "sha512-GmUWfKwEwXA+onvewX9hEJSMcd9V184+uRbEhI5tG28tBP9+IjQhrY7jCjxPvaZA+EvzNPnAy5D1wbJdlNLBNA==",
+      "version": "0.41.0",
+      "resolved": "https://registry.npmjs.org/@dprint/linux-arm64-glibc/-/linux-arm64-glibc-0.41.0.tgz",
+      "integrity": "sha512-U4xWzjjO/aAct8cSSMZFhg8l1jWy6VahXh8zWjGBufwX7t3xEcxMG9RyAp/ioYSY6wl4YXAmnUHywhC+wSjDHQ==",
       "cpu": [
         "arm64"
       ],
@@ -836,9 +836,9 @@
       ]
     },
     "node_modules/@dprint/linux-x64-glibc": {
-      "version": "0.40.2",
-      "resolved": "https://registry.npmjs.org/@dprint/linux-x64-glibc/-/linux-x64-glibc-0.40.2.tgz",
-      "integrity": "sha512-vMHAHdsOY+2thieSWbIrIioDfPgvipwUgd0MZUWOqycTrXU6kLyi2B+5J/2Jc+QO3CiLIbumQd2FH/0vB1eWqA==",
+      "version": "0.41.0",
+      "resolved": "https://registry.npmjs.org/@dprint/linux-x64-glibc/-/linux-x64-glibc-0.41.0.tgz",
+      "integrity": "sha512-wjv5l4mGns7E8i32E8FfAk45tw5O7v4NM17gtvhe6ggOiOD6quHowOH00pLfEakMLMF9y0J5ZO2hxJ/w06bXmQ==",
       "cpu": [
         "x64"
       ],
@@ -849,9 +849,9 @@
       ]
     },
     "node_modules/@dprint/linux-x64-musl": {
-      "version": "0.40.2",
-      "resolved": "https://registry.npmjs.org/@dprint/linux-x64-musl/-/linux-x64-musl-0.40.2.tgz",
-      "integrity": "sha512-nFSbDWd9ORyOhJ7a+RmE39WbuPoQ3OQutIgfAmfikiu/wENzEwxxv4QJ7aFnBaoZb0wuVEEpXShr8vY4p0exkg==",
+      "version": "0.41.0",
+      "resolved": "https://registry.npmjs.org/@dprint/linux-x64-musl/-/linux-x64-musl-0.41.0.tgz",
+      "integrity": "sha512-ZZOqiur9Xi/2uhz0Ce215VTSajAlSrduX/5k/hpIjI7Rgz22Vn77p5fmYxzWkTt/Li1zq5zboTvmGYx0QVNMrQ==",
       "cpu": [
         "x64"
       ],
@@ -862,9 +862,9 @@
       ]
     },
     "node_modules/@dprint/win32-x64": {
-      "version": "0.40.2",
-      "resolved": "https://registry.npmjs.org/@dprint/win32-x64/-/win32-x64-0.40.2.tgz",
-      "integrity": "sha512-qF4VCQzFTZYD61lbQqXLU/IwUTbLK22CancO+uVtXmZRoKU9GaVjcBhMUB7URxsa8rvxWHhHT6ldillI/aOWCg==",
+      "version": "0.41.0",
+      "resolved": "https://registry.npmjs.org/@dprint/win32-x64/-/win32-x64-0.41.0.tgz",
+      "integrity": "sha512-mFx6x4Hn848/D4gPbDm7g1wlnOh2SGoVF9c9HMGCuOobUU2WIBztzV4L5qlFCB3gprlS0ru9BhlMpGhrp0CBYA==",
       "cpu": [
         "x64"
       ],
@@ -1052,9 +1052,9 @@
       "integrity": "sha512-vHlN/GXgaJFJhh4oUYRh1pc4RAqduKlQOrEjVgSxR4JhLXsQcZ/hKWfCsRZAuZbSPzUGEYvggdieamS4FRSe4g=="
     },
     "node_modules/@googlemaps/google-maps-services-js": {
-      "version": "3.3.36",
-      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.36.tgz",
-      "integrity": "sha512-tv9o6/X9l/sytiBiLNAS80DTTDzHBylg0Zsdv846XnkyYyhdaleqFt+D6lh3V9lrcC+YSwnVKaBhDx/weGcMLg==",
+      "version": "3.3.38",
+      "resolved": "https://registry.npmjs.org/@googlemaps/google-maps-services-js/-/google-maps-services-js-3.3.38.tgz",
+      "integrity": "sha512-DGLPj0KzZSMv0mPaWGvthOMsVrpE8rU2dsESlj6CKYT3KA68mgoR/PgoIlsFXLKaJBAgtI+xIZ66JeQhZeUvQw==",
       "optional": true,
       "dependencies": {
         "@googlemaps/url-signature": "^1.0.4",
@@ -1270,16 +1270,16 @@
       }
     },
     "node_modules/@jest/console": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz",
-      "integrity": "sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+      "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
-        "jest-message-util": "^29.6.3",
-        "jest-util": "^29.6.3",
+        "jest-message-util": "^29.7.0",
+        "jest-util": "^29.7.0",
         "slash": "^3.0.0"
       },
       "engines": {
@@ -1287,15 +1287,15 @@
       }
     },
     "node_modules/@jest/core": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz",
-      "integrity": "sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+      "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.6.4",
-        "@jest/reporters": "^29.6.4",
-        "@jest/test-result": "^29.6.4",
-        "@jest/transform": "^29.6.4",
+        "@jest/console": "^29.7.0",
+        "@jest/reporters": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
+        "@jest/transform": "^29.7.0",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
@@ -1303,21 +1303,21 @@
         "ci-info": "^3.2.0",
         "exit": "^0.1.2",
         "graceful-fs": "^4.2.9",
-        "jest-changed-files": "^29.6.3",
-        "jest-config": "^29.6.4",
-        "jest-haste-map": "^29.6.4",
-        "jest-message-util": "^29.6.3",
+        "jest-changed-files": "^29.7.0",
+        "jest-config": "^29.7.0",
+        "jest-haste-map": "^29.7.0",
+        "jest-message-util": "^29.7.0",
         "jest-regex-util": "^29.6.3",
-        "jest-resolve": "^29.6.4",
-        "jest-resolve-dependencies": "^29.6.4",
-        "jest-runner": "^29.6.4",
-        "jest-runtime": "^29.6.4",
-        "jest-snapshot": "^29.6.4",
-        "jest-util": "^29.6.3",
-        "jest-validate": "^29.6.3",
-        "jest-watcher": "^29.6.4",
+        "jest-resolve": "^29.7.0",
+        "jest-resolve-dependencies": "^29.7.0",
+        "jest-runner": "^29.7.0",
+        "jest-runtime": "^29.7.0",
+        "jest-snapshot": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-validate": "^29.7.0",
+        "jest-watcher": "^29.7.0",
         "micromatch": "^4.0.4",
-        "pretty-format": "^29.6.3",
+        "pretty-format": "^29.7.0",
         "slash": "^3.0.0",
         "strip-ansi": "^6.0.0"
       },
@@ -1334,37 +1334,37 @@
       }
     },
     "node_modules/@jest/environment": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz",
-      "integrity": "sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+      "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
       "dev": true,
       "dependencies": {
-        "@jest/fake-timers": "^29.6.4",
+        "@jest/fake-timers": "^29.7.0",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
-        "jest-mock": "^29.6.3"
+        "jest-mock": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/expect": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz",
-      "integrity": "sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+      "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
       "dev": true,
       "dependencies": {
-        "expect": "^29.6.4",
-        "jest-snapshot": "^29.6.4"
+        "expect": "^29.7.0",
+        "jest-snapshot": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/expect-utils": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz",
-      "integrity": "sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+      "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
       "dev": true,
       "dependencies": {
         "jest-get-type": "^29.6.3"
@@ -1374,47 +1374,47 @@
       }
     },
     "node_modules/@jest/fake-timers": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz",
-      "integrity": "sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+      "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.6.3",
         "@sinonjs/fake-timers": "^10.0.2",
         "@types/node": "*",
-        "jest-message-util": "^29.6.3",
-        "jest-mock": "^29.6.3",
-        "jest-util": "^29.6.3"
+        "jest-message-util": "^29.7.0",
+        "jest-mock": "^29.7.0",
+        "jest-util": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/globals": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz",
-      "integrity": "sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+      "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.4",
-        "@jest/expect": "^29.6.4",
+        "@jest/environment": "^29.7.0",
+        "@jest/expect": "^29.7.0",
         "@jest/types": "^29.6.3",
-        "jest-mock": "^29.6.3"
+        "jest-mock": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/@jest/reporters": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz",
-      "integrity": "sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+      "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
       "dev": true,
       "dependencies": {
         "@bcoe/v8-coverage": "^0.2.3",
-        "@jest/console": "^29.6.4",
-        "@jest/test-result": "^29.6.4",
-        "@jest/transform": "^29.6.4",
+        "@jest/console": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
+        "@jest/transform": "^29.7.0",
         "@jest/types": "^29.6.3",
         "@jridgewell/trace-mapping": "^0.3.18",
         "@types/node": "*",
@@ -1428,9 +1428,9 @@
         "istanbul-lib-report": "^3.0.0",
         "istanbul-lib-source-maps": "^4.0.0",
         "istanbul-reports": "^3.1.3",
-        "jest-message-util": "^29.6.3",
-        "jest-util": "^29.6.3",
-        "jest-worker": "^29.6.4",
+        "jest-message-util": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-worker": "^29.7.0",
         "slash": "^3.0.0",
         "string-length": "^4.0.1",
         "strip-ansi": "^6.0.0",
@@ -1475,12 +1475,12 @@
       }
     },
     "node_modules/@jest/test-result": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz",
-      "integrity": "sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
+      "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.6.4",
+        "@jest/console": "^29.7.0",
         "@jest/types": "^29.6.3",
         "@types/istanbul-lib-coverage": "^2.0.0",
         "collect-v8-coverage": "^1.0.0"
@@ -1490,14 +1490,14 @@
       }
     },
     "node_modules/@jest/test-sequencer": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz",
-      "integrity": "sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
+      "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
       "dev": true,
       "dependencies": {
-        "@jest/test-result": "^29.6.4",
+        "@jest/test-result": "^29.7.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.4",
+        "jest-haste-map": "^29.7.0",
         "slash": "^3.0.0"
       },
       "engines": {
@@ -1505,9 +1505,9 @@
       }
     },
     "node_modules/@jest/transform": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz",
-      "integrity": "sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+      "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
@@ -1518,9 +1518,9 @@
         "convert-source-map": "^2.0.0",
         "fast-json-stable-stringify": "^2.1.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.4",
+        "jest-haste-map": "^29.7.0",
         "jest-regex-util": "^29.6.3",
-        "jest-util": "^29.6.3",
+        "jest-util": "^29.7.0",
         "micromatch": "^4.0.4",
         "pirates": "^4.0.4",
         "slash": "^3.0.0",
@@ -1995,9 +1995,9 @@
       "integrity": "sha512-HWwz+6MrfK5NTWcg9GdKFpMBW/yrAV937oXiw2eDtsd88P3SRwoCt6ZO6QmKp9RP3nDU9cbqmuGZ0xBh0eIFeg=="
     },
     "node_modules/@primer/css": {
-      "version": "21.0.8",
-      "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.8.tgz",
-      "integrity": "sha512-nyJnLwNvqZKN9t2ho0ccTKV5Z9QOQayZT+lycWCwkPmNOyMfGlod8mLFHLYd80Ea7H5784QeOl2+3gh710Yt/g==",
+      "version": "21.0.9",
+      "resolved": "https://registry.npmjs.org/@primer/css/-/css-21.0.9.tgz",
+      "integrity": "sha512-kk0TfLqtGwGYJ/qXGLMXDIL4d3qWPjlEB12Hvk08krulbsQRWEsnXjejBIvJG69GyOOuYxXNoHvP2NGenxQ8Jw==",
       "dependencies": {
         "@primer/primitives": "^7.12.0",
         "@primer/view-components": "^0.5.1"
@@ -2038,14 +2038,14 @@
       }
     },
     "node_modules/@puppeteer/browsers": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.7.0.tgz",
-      "integrity": "sha512-sl7zI0IkbQGak/+IE3VEEZab5SSOlI5F6558WvzWGC1n3+C722rfewC1ZIkcF9dsoGSsxhsONoseVlNQG4wWvQ==",
+      "version": "1.7.1",
+      "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.7.1.tgz",
+      "integrity": "sha512-nIb8SOBgDEMFY2iS2MdnUZOg2ikcYchRrBoF+wtdjieRFKR2uGRipHY/oFLo+2N6anDualyClPzGywTHRGrLfw==",
       "dependencies": {
         "debug": "4.3.4",
         "extract-zip": "2.0.1",
         "progress": "2.0.3",
-        "proxy-agent": "6.3.0",
+        "proxy-agent": "6.3.1",
         "tar-fs": "3.0.4",
         "unbzip2-stream": "1.4.3",
         "yargs": "17.7.1"
@@ -2502,12 +2502,12 @@
       "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw=="
     },
     "node_modules/babel-jest": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz",
-      "integrity": "sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+      "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
       "dev": true,
       "dependencies": {
-        "@jest/transform": "^29.6.4",
+        "@jest/transform": "^29.7.0",
         "@types/babel__core": "^7.1.14",
         "babel-plugin-istanbul": "^6.1.1",
         "babel-preset-jest": "^29.6.3",
@@ -2875,9 +2875,9 @@
       }
     },
     "node_modules/caniuse-lite": {
-      "version": "1.0.30001522",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001522.tgz",
-      "integrity": "sha512-TKiyTVZxJGhsTszLuzb+6vUZSjVOAhClszBr2Ta2k9IwtNBT/4dzmL6aywt0HCgEZlmwJzXJd8yNiob6HgwTRg==",
+      "version": "1.0.30001534",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001534.tgz",
+      "integrity": "sha512-vlPVrhsCS7XaSh2VvWluIQEzVhefrUQcEsQWSS5A5V+dM07uv1qHeQzAOTGIMy9i3e9bH15+muvI/UHojVgS/Q==",
       "dev": true,
       "funding": [
         {
@@ -2990,9 +2990,9 @@
       }
     },
     "node_modules/chromium-bidi": {
-      "version": "0.4.22",
-      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.22.tgz",
-      "integrity": "sha512-wR7Y9Ioez+cNXT4ZP7VNM1HRTljpNnMSLw4/RnwhhZUP4yCU7kIQND00YiktuHekch68jklGPK1q9Jkb29+fQg==",
+      "version": "0.4.26",
+      "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.26.tgz",
+      "integrity": "sha512-lukBGfogAI4T0y3acc86RaacqgKQve47/8pV2c+Hr1PjcICj2K4OkL3qfX3qrqxxnd4ddurFC0WBA3VCQqYeUQ==",
       "dependencies": {
         "mitt": "3.0.1"
       },
@@ -3235,13 +3235,13 @@
       "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
     },
     "node_modules/cosmiconfig": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz",
-      "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==",
+      "version": "8.3.5",
+      "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.5.tgz",
+      "integrity": "sha512-A5Xry3xfS96wy2qbiLkQLAg4JUrR2wvfybxj6yqLmrUfMAvhS3MZxIP2oQn0grgYIvJqzpeTEWu4vK0t+12NNw==",
       "dependencies": {
-        "import-fresh": "^3.2.1",
+        "import-fresh": "^3.3.0",
         "js-yaml": "^4.1.0",
-        "parse-json": "^5.0.0",
+        "parse-json": "^5.2.0",
         "path-type": "^4.0.0"
       },
       "engines": {
@@ -3249,6 +3249,35 @@
       },
       "funding": {
         "url": "https://github.com/sponsors/d-fischer"
+      },
+      "peerDependencies": {
+        "typescript": ">=4.9.5"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/create-jest": {
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+      "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+      "dev": true,
+      "dependencies": {
+        "@jest/types": "^29.6.3",
+        "chalk": "^4.0.0",
+        "exit": "^0.1.2",
+        "graceful-fs": "^4.2.9",
+        "jest-config": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "prompts": "^2.0.1"
+      },
+      "bin": {
+        "create-jest": "bin/create-jest.js"
+      },
+      "engines": {
+        "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/cross-fetch": {
@@ -3986,21 +4015,21 @@
       }
     },
     "node_modules/dprint": {
-      "version": "0.40.2",
-      "resolved": "https://registry.npmjs.org/dprint/-/dprint-0.40.2.tgz",
-      "integrity": "sha512-3LdyUV0itEW59UPtsRA2StOWOu8FyOW+BgvJpH/tACRHKi0z5gaQnvSxdS3mbG7dgtEhdRnGg6JoiQyGib6NTg==",
+      "version": "0.41.0",
+      "resolved": "https://registry.npmjs.org/dprint/-/dprint-0.41.0.tgz",
+      "integrity": "sha512-9Ctv6EnwOy5Ai566DczI/QhAC6y+AhWDA2gFU8Zz4xezUy1BevHaIYhfdLWZQxh4Qf4H28lRu1Lq+hhIm1US9w==",
       "dev": true,
       "hasInstallScript": true,
       "bin": {
         "dprint": "bin.js"
       },
       "optionalDependencies": {
-        "@dprint/darwin-arm64": "0.40.2",
-        "@dprint/darwin-x64": "0.40.2",
-        "@dprint/linux-arm64-glibc": "0.40.2",
-        "@dprint/linux-x64-glibc": "0.40.2",
-        "@dprint/linux-x64-musl": "0.40.2",
-        "@dprint/win32-x64": "0.40.2"
+        "@dprint/darwin-arm64": "0.41.0",
+        "@dprint/darwin-x64": "0.41.0",
+        "@dprint/linux-arm64-glibc": "0.41.0",
+        "@dprint/linux-x64-glibc": "0.41.0",
+        "@dprint/linux-x64-musl": "0.41.0",
+        "@dprint/win32-x64": "0.41.0"
       }
     },
     "node_modules/ee-first": {
@@ -4023,9 +4052,9 @@
       }
     },
     "node_modules/electron-to-chromium": {
-      "version": "1.4.500",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.500.tgz",
-      "integrity": "sha512-P38NO8eOuWOKY1sQk5yE0crNtrjgjJj6r3NrbIKtG18KzCHmHE2Bt+aQA7/y0w3uYsHWxDa6icOohzjLJ4vJ4A==",
+      "version": "1.4.520",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.520.tgz",
+      "integrity": "sha512-Frfus2VpYADsrh1lB3v/ft/WVFlVzOIm+Q0p7U7VqHI6qr7NWHYKe+Wif3W50n7JAFoBsWVsoU0+qDks6WQ60g==",
       "dev": true
     },
     "node_modules/emittery": {
@@ -4384,16 +4413,16 @@
       }
     },
     "node_modules/expect": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz",
-      "integrity": "sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+      "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
       "dev": true,
       "dependencies": {
-        "@jest/expect-utils": "^29.6.4",
+        "@jest/expect-utils": "^29.7.0",
         "jest-get-type": "^29.6.3",
-        "jest-matcher-utils": "^29.6.4",
-        "jest-message-util": "^29.6.3",
-        "jest-util": "^29.6.3"
+        "jest-matcher-utils": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-util": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -4441,11 +4470,11 @@
       }
     },
     "node_modules/express-rate-limit": {
-      "version": "6.11.1",
-      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-6.11.1.tgz",
-      "integrity": "sha512-8+UpWtQY25lJaa4+3WxDBGDcAu4atcTruSs3QSL5VPEplYy6kmk84wutG9rUkkK5LmMQQ7TFHWLZYITwVNbbEg==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.0.0.tgz",
+      "integrity": "sha512-zKMQ9meikj7j3ILeVvHIaBejAYljgDBtGuCfbzNS2d0VCW4s68ONdtEhBJnOGW/Ty1wGeNXgC4m/C1bBUIX0LA==",
       "engines": {
-        "node": ">= 14"
+        "node": ">= 16"
       },
       "peerDependencies": {
         "express": "^4 || ^5"
@@ -5593,15 +5622,15 @@
       }
     },
     "node_modules/jest": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz",
-      "integrity": "sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
+      "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.6.4",
+        "@jest/core": "^29.7.0",
         "@jest/types": "^29.6.3",
         "import-local": "^3.0.2",
-        "jest-cli": "^29.6.4"
+        "jest-cli": "^29.7.0"
       },
       "bin": {
         "jest": "bin/jest.js"
@@ -5619,13 +5648,13 @@
       }
     },
     "node_modules/jest-changed-files": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz",
-      "integrity": "sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
+      "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
       "dev": true,
       "dependencies": {
         "execa": "^5.0.0",
-        "jest-util": "^29.6.3",
+        "jest-util": "^29.7.0",
         "p-limit": "^3.1.0"
       },
       "engines": {
@@ -5633,28 +5662,28 @@
       }
     },
     "node_modules/jest-circus": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz",
-      "integrity": "sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
+      "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.4",
-        "@jest/expect": "^29.6.4",
-        "@jest/test-result": "^29.6.4",
+        "@jest/environment": "^29.7.0",
+        "@jest/expect": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "co": "^4.6.0",
         "dedent": "^1.0.0",
         "is-generator-fn": "^2.0.0",
-        "jest-each": "^29.6.3",
-        "jest-matcher-utils": "^29.6.4",
-        "jest-message-util": "^29.6.3",
-        "jest-runtime": "^29.6.4",
-        "jest-snapshot": "^29.6.4",
-        "jest-util": "^29.6.3",
+        "jest-each": "^29.7.0",
+        "jest-matcher-utils": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-runtime": "^29.7.0",
+        "jest-snapshot": "^29.7.0",
+        "jest-util": "^29.7.0",
         "p-limit": "^3.1.0",
-        "pretty-format": "^29.6.3",
+        "pretty-format": "^29.7.0",
         "pure-rand": "^6.0.0",
         "slash": "^3.0.0",
         "stack-utils": "^2.0.3"
@@ -5664,22 +5693,21 @@
       }
     },
     "node_modules/jest-cli": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz",
-      "integrity": "sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
+      "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
       "dev": true,
       "dependencies": {
-        "@jest/core": "^29.6.4",
-        "@jest/test-result": "^29.6.4",
+        "@jest/core": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
         "@jest/types": "^29.6.3",
         "chalk": "^4.0.0",
+        "create-jest": "^29.7.0",
         "exit": "^0.1.2",
-        "graceful-fs": "^4.2.9",
         "import-local": "^3.0.2",
-        "jest-config": "^29.6.4",
-        "jest-util": "^29.6.3",
-        "jest-validate": "^29.6.3",
-        "prompts": "^2.0.1",
+        "jest-config": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-validate": "^29.7.0",
         "yargs": "^17.3.1"
       },
       "bin": {
@@ -5698,31 +5726,31 @@
       }
     },
     "node_modules/jest-config": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz",
-      "integrity": "sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+      "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
-        "@jest/test-sequencer": "^29.6.4",
+        "@jest/test-sequencer": "^29.7.0",
         "@jest/types": "^29.6.3",
-        "babel-jest": "^29.6.4",
+        "babel-jest": "^29.7.0",
         "chalk": "^4.0.0",
         "ci-info": "^3.2.0",
         "deepmerge": "^4.2.2",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-circus": "^29.6.4",
-        "jest-environment-node": "^29.6.4",
+        "jest-circus": "^29.7.0",
+        "jest-environment-node": "^29.7.0",
         "jest-get-type": "^29.6.3",
         "jest-regex-util": "^29.6.3",
-        "jest-resolve": "^29.6.4",
-        "jest-runner": "^29.6.4",
-        "jest-util": "^29.6.3",
-        "jest-validate": "^29.6.3",
+        "jest-resolve": "^29.7.0",
+        "jest-runner": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-validate": "^29.7.0",
         "micromatch": "^4.0.4",
         "parse-json": "^5.2.0",
-        "pretty-format": "^29.6.3",
+        "pretty-format": "^29.7.0",
         "slash": "^3.0.0",
         "strip-json-comments": "^3.1.1"
       },
@@ -5743,24 +5771,24 @@
       }
     },
     "node_modules/jest-diff": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz",
-      "integrity": "sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+      "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
         "diff-sequences": "^29.6.3",
         "jest-get-type": "^29.6.3",
-        "pretty-format": "^29.6.3"
+        "pretty-format": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-docblock": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz",
-      "integrity": "sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
+      "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
       "dev": true,
       "dependencies": {
         "detect-newline": "^3.0.0"
@@ -5770,33 +5798,33 @@
       }
     },
     "node_modules/jest-each": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz",
-      "integrity": "sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
+      "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.6.3",
         "chalk": "^4.0.0",
         "jest-get-type": "^29.6.3",
-        "jest-util": "^29.6.3",
-        "pretty-format": "^29.6.3"
+        "jest-util": "^29.7.0",
+        "pretty-format": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-environment-node": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz",
-      "integrity": "sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+      "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.4",
-        "@jest/fake-timers": "^29.6.4",
+        "@jest/environment": "^29.7.0",
+        "@jest/fake-timers": "^29.7.0",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
-        "jest-mock": "^29.6.3",
-        "jest-util": "^29.6.3"
+        "jest-mock": "^29.7.0",
+        "jest-util": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -5812,9 +5840,9 @@
       }
     },
     "node_modules/jest-haste-map": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz",
-      "integrity": "sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+      "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.6.3",
@@ -5824,8 +5852,8 @@
         "fb-watchman": "^2.0.0",
         "graceful-fs": "^4.2.9",
         "jest-regex-util": "^29.6.3",
-        "jest-util": "^29.6.3",
-        "jest-worker": "^29.6.4",
+        "jest-util": "^29.7.0",
+        "jest-worker": "^29.7.0",
         "micromatch": "^4.0.4",
         "walker": "^1.0.8"
       },
@@ -5837,37 +5865,37 @@
       }
     },
     "node_modules/jest-leak-detector": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz",
-      "integrity": "sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
+      "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
       "dev": true,
       "dependencies": {
         "jest-get-type": "^29.6.3",
-        "pretty-format": "^29.6.3"
+        "pretty-format": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-matcher-utils": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz",
-      "integrity": "sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+      "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
-        "jest-diff": "^29.6.4",
+        "jest-diff": "^29.7.0",
         "jest-get-type": "^29.6.3",
-        "pretty-format": "^29.6.3"
+        "pretty-format": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-message-util": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz",
-      "integrity": "sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+      "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
       "dev": true,
       "dependencies": {
         "@babel/code-frame": "^7.12.13",
@@ -5876,7 +5904,7 @@
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
         "micromatch": "^4.0.4",
-        "pretty-format": "^29.6.3",
+        "pretty-format": "^29.7.0",
         "slash": "^3.0.0",
         "stack-utils": "^2.0.3"
       },
@@ -5885,14 +5913,14 @@
       }
     },
     "node_modules/jest-mock": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz",
-      "integrity": "sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+      "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.6.3",
         "@types/node": "*",
-        "jest-util": "^29.6.3"
+        "jest-util": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -5925,17 +5953,17 @@
       }
     },
     "node_modules/jest-resolve": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz",
-      "integrity": "sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
+      "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
       "dev": true,
       "dependencies": {
         "chalk": "^4.0.0",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.4",
+        "jest-haste-map": "^29.7.0",
         "jest-pnp-resolver": "^1.2.2",
-        "jest-util": "^29.6.3",
-        "jest-validate": "^29.6.3",
+        "jest-util": "^29.7.0",
+        "jest-validate": "^29.7.0",
         "resolve": "^1.20.0",
         "resolve.exports": "^2.0.0",
         "slash": "^3.0.0"
@@ -5945,43 +5973,43 @@
       }
     },
     "node_modules/jest-resolve-dependencies": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz",
-      "integrity": "sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
+      "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
       "dev": true,
       "dependencies": {
         "jest-regex-util": "^29.6.3",
-        "jest-snapshot": "^29.6.4"
+        "jest-snapshot": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
       }
     },
     "node_modules/jest-runner": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz",
-      "integrity": "sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
+      "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
       "dev": true,
       "dependencies": {
-        "@jest/console": "^29.6.4",
-        "@jest/environment": "^29.6.4",
-        "@jest/test-result": "^29.6.4",
-        "@jest/transform": "^29.6.4",
+        "@jest/console": "^29.7.0",
+        "@jest/environment": "^29.7.0",
+        "@jest/test-result": "^29.7.0",
+        "@jest/transform": "^29.7.0",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
         "graceful-fs": "^4.2.9",
-        "jest-docblock": "^29.6.3",
-        "jest-environment-node": "^29.6.4",
-        "jest-haste-map": "^29.6.4",
-        "jest-leak-detector": "^29.6.3",
-        "jest-message-util": "^29.6.3",
-        "jest-resolve": "^29.6.4",
-        "jest-runtime": "^29.6.4",
-        "jest-util": "^29.6.3",
-        "jest-watcher": "^29.6.4",
-        "jest-worker": "^29.6.4",
+        "jest-docblock": "^29.7.0",
+        "jest-environment-node": "^29.7.0",
+        "jest-haste-map": "^29.7.0",
+        "jest-leak-detector": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-resolve": "^29.7.0",
+        "jest-runtime": "^29.7.0",
+        "jest-util": "^29.7.0",
+        "jest-watcher": "^29.7.0",
+        "jest-worker": "^29.7.0",
         "p-limit": "^3.1.0",
         "source-map-support": "0.5.13"
       },
@@ -5990,17 +6018,17 @@
       }
     },
     "node_modules/jest-runtime": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz",
-      "integrity": "sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
+      "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
       "dev": true,
       "dependencies": {
-        "@jest/environment": "^29.6.4",
-        "@jest/fake-timers": "^29.6.4",
-        "@jest/globals": "^29.6.4",
+        "@jest/environment": "^29.7.0",
+        "@jest/fake-timers": "^29.7.0",
+        "@jest/globals": "^29.7.0",
         "@jest/source-map": "^29.6.3",
-        "@jest/test-result": "^29.6.4",
-        "@jest/transform": "^29.6.4",
+        "@jest/test-result": "^29.7.0",
+        "@jest/transform": "^29.7.0",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "chalk": "^4.0.0",
@@ -6008,13 +6036,13 @@
         "collect-v8-coverage": "^1.0.0",
         "glob": "^7.1.3",
         "graceful-fs": "^4.2.9",
-        "jest-haste-map": "^29.6.4",
-        "jest-message-util": "^29.6.3",
-        "jest-mock": "^29.6.3",
+        "jest-haste-map": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-mock": "^29.7.0",
         "jest-regex-util": "^29.6.3",
-        "jest-resolve": "^29.6.4",
-        "jest-snapshot": "^29.6.4",
-        "jest-util": "^29.6.3",
+        "jest-resolve": "^29.7.0",
+        "jest-snapshot": "^29.7.0",
+        "jest-util": "^29.7.0",
         "slash": "^3.0.0",
         "strip-bom": "^4.0.0"
       },
@@ -6023,9 +6051,9 @@
       }
     },
     "node_modules/jest-snapshot": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz",
-      "integrity": "sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
+      "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
       "dev": true,
       "dependencies": {
         "@babel/core": "^7.11.6",
@@ -6033,20 +6061,20 @@
         "@babel/plugin-syntax-jsx": "^7.7.2",
         "@babel/plugin-syntax-typescript": "^7.7.2",
         "@babel/types": "^7.3.3",
-        "@jest/expect-utils": "^29.6.4",
-        "@jest/transform": "^29.6.4",
+        "@jest/expect-utils": "^29.7.0",
+        "@jest/transform": "^29.7.0",
         "@jest/types": "^29.6.3",
         "babel-preset-current-node-syntax": "^1.0.0",
         "chalk": "^4.0.0",
-        "expect": "^29.6.4",
+        "expect": "^29.7.0",
         "graceful-fs": "^4.2.9",
-        "jest-diff": "^29.6.4",
+        "jest-diff": "^29.7.0",
         "jest-get-type": "^29.6.3",
-        "jest-matcher-utils": "^29.6.4",
-        "jest-message-util": "^29.6.3",
-        "jest-util": "^29.6.3",
+        "jest-matcher-utils": "^29.7.0",
+        "jest-message-util": "^29.7.0",
+        "jest-util": "^29.7.0",
         "natural-compare": "^1.4.0",
-        "pretty-format": "^29.6.3",
+        "pretty-format": "^29.7.0",
         "semver": "^7.5.3"
       },
       "engines": {
@@ -6054,9 +6082,9 @@
       }
     },
     "node_modules/jest-util": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz",
-      "integrity": "sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+      "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.6.3",
@@ -6071,9 +6099,9 @@
       }
     },
     "node_modules/jest-validate": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz",
-      "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+      "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
       "dev": true,
       "dependencies": {
         "@jest/types": "^29.6.3",
@@ -6081,7 +6109,7 @@
         "chalk": "^4.0.0",
         "jest-get-type": "^29.6.3",
         "leven": "^3.1.0",
-        "pretty-format": "^29.6.3"
+        "pretty-format": "^29.7.0"
       },
       "engines": {
         "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -6100,18 +6128,18 @@
       }
     },
     "node_modules/jest-watcher": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz",
-      "integrity": "sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
+      "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
       "dev": true,
       "dependencies": {
-        "@jest/test-result": "^29.6.4",
+        "@jest/test-result": "^29.7.0",
         "@jest/types": "^29.6.3",
         "@types/node": "*",
         "ansi-escapes": "^4.2.1",
         "chalk": "^4.0.0",
         "emittery": "^0.13.1",
-        "jest-util": "^29.6.3",
+        "jest-util": "^29.7.0",
         "string-length": "^4.0.1"
       },
       "engines": {
@@ -6119,13 +6147,13 @@
       }
     },
     "node_modules/jest-worker": {
-      "version": "29.6.4",
-      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz",
-      "integrity": "sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+      "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
       "dev": true,
       "dependencies": {
         "@types/node": "*",
-        "jest-util": "^29.6.3",
+        "jest-util": "^29.7.0",
         "merge-stream": "^2.0.0",
         "supports-color": "^8.0.0"
       },
@@ -7389,9 +7417,9 @@
       }
     },
     "node_modules/pretty-format": {
-      "version": "29.6.3",
-      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz",
-      "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==",
+      "version": "29.7.0",
+      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+      "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
       "dev": true,
       "dependencies": {
         "@jest/schemas": "^29.6.3",
@@ -7456,18 +7484,18 @@
       }
     },
     "node_modules/proxy-agent": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz",
-      "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz",
+      "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==",
       "dependencies": {
         "agent-base": "^7.0.2",
         "debug": "^4.3.4",
         "http-proxy-agent": "^7.0.0",
-        "https-proxy-agent": "^7.0.0",
+        "https-proxy-agent": "^7.0.2",
         "lru-cache": "^7.14.1",
-        "pac-proxy-agent": "^7.0.0",
+        "pac-proxy-agent": "^7.0.1",
         "proxy-from-env": "^1.1.0",
-        "socks-proxy-agent": "^8.0.1"
+        "socks-proxy-agent": "^8.0.2"
       },
       "engines": {
         "node": ">= 14"
@@ -7565,30 +7593,30 @@
       }
     },
     "node_modules/puppeteer": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.1.1.tgz",
-      "integrity": "sha512-2TLntjGA4qLrI9/8N0UK/5OoZJ2Ue7QgphN2SD+RsaHiha12AEiVyMGsB+i6LY1IoPAtEgYIjblQ7lw3kWDNRw==",
+      "version": "21.2.1",
+      "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.2.1.tgz",
+      "integrity": "sha512-bgY/lYBH3rR+m5EP1FxzY2MRMrau7Pyq+N5YlspA63sF+cBkUiTn5WZXwXm7mEHwkkOSVi5LiS74T5QIgrSklg==",
       "hasInstallScript": true,
       "dependencies": {
-        "@puppeteer/browsers": "1.7.0",
-        "cosmiconfig": "8.2.0",
-        "puppeteer-core": "21.1.1"
+        "@puppeteer/browsers": "1.7.1",
+        "cosmiconfig": "8.3.5",
+        "puppeteer-core": "21.2.1"
       },
       "engines": {
         "node": ">=16.3.0"
       }
     },
     "node_modules/puppeteer-core": {
-      "version": "21.1.1",
-      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.1.1.tgz",
-      "integrity": "sha512-Tlcajcf44zwfa9Sbwv3T8BtaNMJ69wtpHIxwl2NOBTyTK3D1wppQovXTjfw0TDOm3a16eCfQ+5BMi3vRQ4kuAQ==",
+      "version": "21.2.1",
+      "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.2.1.tgz",
+      "integrity": "sha512-+I8EjpWFeeFKScpQiTEnC4jGve2Wr4eA9qUMoa8S317DJPm9h7wzrT4YednZK2TQZMyPtPQ2Disb/Tg02+4Naw==",
       "dependencies": {
-        "@puppeteer/browsers": "1.7.0",
-        "chromium-bidi": "0.4.22",
+        "@puppeteer/browsers": "1.7.1",
+        "chromium-bidi": "0.4.26",
         "cross-fetch": "4.0.0",
         "debug": "4.3.4",
         "devtools-protocol": "0.0.1159816",
-        "ws": "8.13.0"
+        "ws": "8.14.1"
       },
       "engines": {
         "node": ">=16.3.0"
@@ -7624,9 +7652,9 @@
       "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
     },
     "node_modules/pure-rand": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz",
-      "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==",
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz",
+      "integrity": "sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w==",
       "dev": true,
       "funding": [
         {
@@ -9226,9 +9254,9 @@
       }
     },
     "node_modules/ws": {
-      "version": "8.13.0",
-      "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
-      "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
+      "version": "8.14.1",
+      "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz",
+      "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==",
       "engines": {
         "node": ">=10.0.0"
       },
diff --git a/package.json b/package.json
index d35f8b5412b..1ee6f103bf1 100644
--- a/package.json
+++ b/package.json
@@ -34,7 +34,7 @@
     "@faker-js/faker": "^8.0.2",
     "@octokit/graphql": "^7.0.1",
     "@octokit/rest": "^20.0.1",
-    "@primer/css": "^21.0.8",
+    "@primer/css": "^21.0.9",
     "@primer/octicons": "^19.7.0",
     "@twemoji/parser": "^14.1.0",
     "axios": "^1.5.0",
@@ -45,7 +45,7 @@
     "ejs": "^3.1.9",
     "emoji-name-map": "^1.2.9",
     "express": "^4.18.2",
-    "express-rate-limit": "^6.11.1",
+    "express-rate-limit": "^7.0.0",
     "file-type": "^18.5.0",
     "js-yaml": "^4.1.0",
     "jsdom": "^22.1.0",
@@ -56,7 +56,7 @@
     "open-graph-scraper": "^6.2.2",
     "png-js": "^1.0.0",
     "prismjs": "^1.29.0",
-    "puppeteer": "^21.1.1",
+    "puppeteer": "^21.2.1",
     "purgecss": "^5.0.0",
     "rss-parser": "^3.13.0",
     "sanitize-html": "^2.11.0",
@@ -68,9 +68,9 @@
     "xml-formatter": "^3.5.0"
   },
   "devDependencies": {
-    "dprint": "^0.40.2",
+    "dprint": "^0.41.0",
     "eslint": "^8.49.0",
-    "jest": "^29.6.3"
+    "jest": "^29.7.0"
   },
   "jest": {
     "testEnvironment": "node",
@@ -78,7 +78,7 @@
     "transform": {}
   },
   "optionalDependencies": {
-    "@googlemaps/google-maps-services-js": "^3.3.36",
+    "@googlemaps/google-maps-services-js": "^3.3.38",
     "chess.js": "^1.0.0-beta.6",
     "color": "^4.2.3",
     "gifencoder": "^2.0.1",

From 183ade98e3aa40d46eeea8dd3412fafe1469ac3f Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 14 Sep 2023 05:49:43 +0200
Subject: [PATCH 184/196] fix(app/web): accomodate express rate limit breaking
 change

---
 source/app/web/instance.mjs | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/source/app/web/instance.mjs b/source/app/web/instance.mjs
index 4b13c99565d..ea00c4e43c0 100644
--- a/source/app/web/instance.mjs
+++ b/source/app/web/instance.mjs
@@ -81,9 +81,12 @@ export default async function({sandbox = false} = {}) {
   //Rate limiter middleware
   if (ratelimiter) {
     app.set("trust proxy", 1)
+    const disabled = (ratelimiter.max === 0)
+    if (disabled)
+      delete ratelimiter.max
     middlewares.push(ratelimit({
       skip(req, _res) {
-        return !!cache.get(req.params.login)
+        return (disabled) || (!!cache.get(req.params.login))
       },
       message: "Too many requests: retry later",
       headers: true,

From 4362c2a27b55f689f789edb0eea1555b560f69e6 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Thu, 14 Sep 2023 05:54:31 +0200
Subject: [PATCH 185/196] chore(deps): upgrade marked (cannot do it to 8.0.0
 because of deprecated options still used)

---
 package-lock.json | 8 ++++----
 package.json      | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 2dd396bfb57..03cd2a100c7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -31,7 +31,7 @@
         "js-yaml": "^4.1.0",
         "jsdom": "^22.1.0",
         "linguist-js": "^2.6.1",
-        "marked": "^7.0.4",
+        "marked": "^7.0.5",
         "memory-cache": "^0.2.0",
         "minimatch": "^9.0.3",
         "open-graph-scraper": "^6.2.2",
@@ -6435,9 +6435,9 @@
       }
     },
     "node_modules/marked": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-7.0.4.tgz",
-      "integrity": "sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==",
+      "version": "7.0.5",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-7.0.5.tgz",
+      "integrity": "sha512-lwNAFTfXgqpt/XvK17a/8wY9/q6fcSPZT1aP6QW0u74VwaJF/Z9KbRcX23sWE4tODM+AolJNcUtErTkgOeFP/Q==",
       "bin": {
         "marked": "bin/marked.js"
       },
diff --git a/package.json b/package.json
index 1ee6f103bf1..597326404f5 100644
--- a/package.json
+++ b/package.json
@@ -50,7 +50,7 @@
     "js-yaml": "^4.1.0",
     "jsdom": "^22.1.0",
     "linguist-js": "^2.6.1",
-    "marked": "^7.0.4",
+    "marked": "^7.0.5",
     "memory-cache": "^0.2.0",
     "minimatch": "^9.0.3",
     "open-graph-scraper": "^6.2.2",

From 6218d94ea38efc5b0de2cee5714a3f6371215b8a Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 14 Sep 2023 04:33:38 +0000
Subject: [PATCH 186/196] chore: code formatting

---
 source/app/web/instance.mjs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source/app/web/instance.mjs b/source/app/web/instance.mjs
index ea00c4e43c0..7c07776415e 100644
--- a/source/app/web/instance.mjs
+++ b/source/app/web/instance.mjs
@@ -81,7 +81,7 @@ export default async function({sandbox = false} = {}) {
   //Rate limiter middleware
   if (ratelimiter) {
     app.set("trust proxy", 1)
-    const disabled = (ratelimiter.max === 0)
+    const disabled = ratelimiter.max === 0
     if (disabled)
       delete ratelimiter.max
     middlewares.push(ratelimit({

From 1e8d436e6a48b0715730bba672583355026432cd Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Thu, 14 Sep 2023 04:34:24 +0000
Subject: [PATCH 187/196] ci: auto-regenerate files

---
 README.md                      | 2 ++
 source/plugins/lines/README.md | 3 +--
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index f2a09a83a94..2adbfbc74e2 100644
--- a/README.md
+++ b/README.md
@@ -436,6 +436,8 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
 # 📚 Documentation
 
 
+> <sup>*⚠️ This is the documentation of **v3.35-beta** (`@master`/`@main` branches) which includes [unreleased features](https://github.com/lowlighter/metrics/compare/latest...master) planned for next release. See documentation for current released version [**v3.34** (`@latest` branch) here](https://github.com/lowlighter/metrics/blob/latest/README.md).* </sup>
+
 
 
 ## 🦮 Setup
diff --git a/source/plugins/lines/README.md b/source/plugins/lines/README.md
index 8eb97ad1a76..f1f52c71dfd 100644
--- a/source/plugins/lines/README.md
+++ b/source/plugins/lines/README.md
@@ -109,8 +109,7 @@ after returning correct results upon performing another query.</p>
 <img width="900" height="1" alt=""></td>
   </tr>
   <tr>
-    <td nowrap="nowrap">✨ On <code>master</code>/<code>main</code><br>
-<b>type:</b> <code>number</code>
+    <td nowrap="nowrap"><b>type:</b> <code>number</code>
 <i>(0 ≤
 𝑥)</i>
 <br>

From c430d64381c6a71db703b73ed27412ed641337d1 Mon Sep 17 00:00:00 2001
From: Movrsi <129067651+movrsi@users.noreply.github.com>
Date: Thu, 5 Oct 2023 01:57:36 +0000
Subject: [PATCH 188/196] fic(docs): correct metric image centering. (#1541)

---
 .github/readme/partials/documentation/setup/action.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/readme/partials/documentation/setup/action.md b/.github/readme/partials/documentation/setup/action.md
index 1b5d3734bfc..e066c398359 100644
--- a/.github/readme/partials/documentation/setup/action.md
+++ b/.github/readme/partials/documentation/setup/action.md
@@ -127,7 +127,7 @@ Update profile `README.md` to include rendered image (filename may differ if `fi
 
 *Example: add rendered image with html for more customization*
 ```html
-<img align="center" src="/github-metrics.svg" alt="Metrics" width="400">
+<p align="center"><img src="/github-metrics.svg" alt="Metrics" width="400"></p>
 ```
 
 *Example: add rendered image and prevent GitHub from auto linking to the image*

From 9f08a38cc0d40755b5ef1038aec700f6148f7790 Mon Sep 17 00:00:00 2001
From: Thanh Tran <56623206+dajneem23@users.noreply.github.com>
Date: Sat, 7 Oct 2023 09:44:19 -0400
Subject: [PATCH 189/196] =?UTF-8?q?feat:=20add=20plugins=20crypto=20?=
 =?UTF-8?q?=E2=9C=85=20(#1535)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 source/plugins/community/crypto/README.md    | 100 +++++++++++++++++++
 source/plugins/community/crypto/examples.yml |  13 +++
 source/plugins/community/crypto/index.mjs    |  73 ++++++++++++++
 source/plugins/community/crypto/metadata.yml |  52 ++++++++++
 source/templates/classic/partials/_.json     |   1 +
 source/templates/classic/partials/crypto.ejs |  68 +++++++++++++
 source/templates/repository/partials/_.json  |   1 +
 7 files changed, 308 insertions(+)
 create mode 100644 source/plugins/community/crypto/README.md
 create mode 100644 source/plugins/community/crypto/examples.yml
 create mode 100644 source/plugins/community/crypto/index.mjs
 create mode 100644 source/plugins/community/crypto/metadata.yml
 create mode 100644 source/templates/classic/partials/crypto.ejs

diff --git a/source/plugins/community/crypto/README.md b/source/plugins/community/crypto/README.md
new file mode 100644
index 00000000000..948a99c5a29
--- /dev/null
+++ b/source/plugins/community/crypto/README.md
@@ -0,0 +1,100 @@
+<!-- Header -->
+<table>
+  <tr><td colspan="2"><a href="/README.md#-plugins">← Back to plugins index</a></td></tr>
+  <tr><th colspan="2"><h3>🪙 Crypto</h3></th></tr>
+  <tr><td colspan="2" align="center">
+    <p>This plugin generates an SVG image containing crypto metrics from a given address. It uses the CoinGecko API to fetch crypto prices.</p>
+    <p>For more information, check the <a href="https://www.coingecko.com/vi/api/documentation">CoinGecko API documentation</a>.</p>
+  </td></tr>
+  <tr><th>Authors</th><td><a href="https://github.com/dajneem23">@dajneem23</a></td></tr>
+  <tr>
+    <th rowspan="3">Supported Features<br><sub><a href="metadata.yml">→ Full specification</a></sub></th>
+    <td>
+      <ul>
+        <li><a href="/source/templates/classic/README.md"><code>📗 Classic template</code></a></li>
+        <li><a href="/source/templates/repository/README.md"><code>📘 Repository template</code></a></li>
+      </ul>
+    </td>
+  </tr>
+  <tr>
+    <td>
+      <ul>
+        <li><code>👤 Users</code></li>
+        <li><code>👥 Organizations</code></li>
+        <li><code>📓 Repositories</code></li>
+      </ul>
+    </td>
+  </tr>
+  <tr>
+    <td><code>🗝️ plugin_crypto</code></td>
+  </tr>
+  <tr>
+    <td colspan="2" align="center">
+      <img src="https://via.placeholder.com/468x60?text=No%20preview%20available" alt=""></img>
+      <img width="900" height="1" alt="">
+    </td>
+  </tr>
+</table>
+<!-- /Header -->
+
+## ➡️ Available Options
+
+<!-- Options -->
+<table>
+  <tr>
+    <td align="center" nowrap="nowrap">Option</td><td align="center" nowrap="nowrap">Description</td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_crypto</code></h4></td>
+    <td rowspan="2"><p>Enable crypto plugin</p><img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">Type: <code>boolean</code><br>Default: <code>no</code><br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_crypto_id</code></h4></td>
+    <td rowspan="2"><p>Crypto id (from Coingecko)</p><img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">Type: <code>string</code><br>Default: ""<br>Example: bitcoin<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_crypto_vs_currency</code></h4></td>
+    <td rowspan="2"><p>The target currency of market data (usd, eur, jpy, etc.)</p><img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">Type: <code>string</code><br>Default: "usd"<br>Example: "usd"<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_crypto_days</code></h4></td>
+    <td rowspan="2"><p>Data up to number of days ago (eg. 1,14,30,max)</p><img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">Type: <code>string</code><br>Default: "1"<br>Example: 1<br></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap"><h4><code>plugin_crypto_precision</code></h4></td>
+    <td rowspan="2"><p>The number of decimal places to use</p><img width="900" height="1" alt=""></td>
+  </tr>
+  <tr>
+    <td nowrap="nowrap">Type: <code>number</code><br>Default: 2<br>Example: 2<br></td>
+  </tr>
+</table>
+<!-- /Options -->
+
+<!--examples-->
+
+```yaml
+name: Crypto Metrics
+uses: lowlighter/metrics@latest
+with:
+  filename: metrics.plugin.crypto.svg
+  token: NOT_NEEDED
+  base: ""
+  plugin_crypto: yes
+  plugin_crypto_id: bitcoin
+  plugin_crypto_vs_currency: usd
+  plugin_crypto_days: 1
+  plugin_crypto_precision: 2
+```
+<!--/examples-->
diff --git a/source/plugins/community/crypto/examples.yml b/source/plugins/community/crypto/examples.yml
new file mode 100644
index 00000000000..50a861758e0
--- /dev/null
+++ b/source/plugins/community/crypto/examples.yml
@@ -0,0 +1,13 @@
+- name: Crypto Metrics
+  uses: lowlighter/metrics@latest
+  with:
+    filename: metrics.plugin.crypto.svg
+    token: NOT_NEEDED
+    base: ""
+    plugin_crypto: yes
+    plugin_crypto_id: bitcoin
+    plugin_crypto_vs_currency: usd
+    plugin_crypto_days: 1
+    plugin_crypto_precision: 2
+  prod:
+    skip: true
diff --git a/source/plugins/community/crypto/index.mjs b/source/plugins/community/crypto/index.mjs
new file mode 100644
index 00000000000..9f2f9f80c86
--- /dev/null
+++ b/source/plugins/community/crypto/index.mjs
@@ -0,0 +1,73 @@
+//Setup
+export default async function({login, q, imports, data, account}, {enabled = false, extras = false} = {}) {
+  //Plugin execution
+  try {
+    //Check if plugin is enabled and requirements are met
+    if ((!q.crypto) || (!imports.metadata.plugins.crypto.enabled(enabled, {extras})))
+      return null
+
+        //Load inputs
+    let {id, days, vs_currency, precision } = imports.metadata.plugins.crypto.inputs({data, account, q})
+    if (!id)
+      throw { error: { message: "Crypto currency id is not set" } }
+
+    console.debug(`metrics/compute/${login}/plugins > crypto > querying api for crypto`)
+
+    const {
+      data: coin
+    } = await imports.axios.get(`https://api.coingecko.com/api/v3/coins/${id}`,
+      {
+        params: {
+          market_data:true
+        }
+      })
+
+    if (!coin) {
+      throw {error: {message: "Crypto currency not found"}}
+    }
+
+    const {
+    data: { prices },
+   } = await imports.axios.get(`https://api.coingecko.com/api/v3/coins/${id}/market_chart`, {
+      params: {
+       vs_currency,
+       days,
+       precision
+      },
+   })
+
+
+    const chart = imports.Graph.timeline(
+      prices.map((y, _) => ({ x: new Date(y[0]), y: y[1] })),
+      {
+        low: Math.min(...prices.map((y, _) => y[1])),
+
+        high: Math.max(...prices.map((y, _) => y[1])),
+
+        points: false, text: false,
+        width: 480 * (1 + data.large),
+        height: 200
+      }
+    )
+
+
+    //Results
+    return {
+      chart,
+      id,
+      precision,
+      days:{"1":"Today", "14":"2 Weeks", "30":"1 Month", max :"All-time"}[days],
+      symbol: coin.symbol,
+      name: coin.name,
+      current_price: coin.market_data.current_price[vs_currency],
+      price_change_percentage_24h: coin.market_data.price_change_percentage_24h,
+      vs_currency,
+      logo:coin.image.small,
+    }
+  }
+  //Handle errors
+  catch (error) {
+    throw imports.format.error(error)
+  }
+}
+
diff --git a/source/plugins/community/crypto/metadata.yml b/source/plugins/community/crypto/metadata.yml
new file mode 100644
index 00000000000..b68a2df9e91
--- /dev/null
+++ b/source/plugins/community/crypto/metadata.yml
@@ -0,0 +1,52 @@
+name: 🪙 Crypto
+category: community
+description: |
+  Generates a SVG image containing crypto metrics from a given address.
+  This plugin using coingecko API to fetch crypto prices.
+  check https://www.coingecko.com/vi/api/documentation for more information.
+examples:
+  default: https://via.placeholder.com/468x60?text=No%20preview%20available
+authors:
+  - dajneem23
+supports:
+  - user
+  - organization
+  - repository
+scopes: []
+inputs:
+
+  plugin_crypto:
+    description: |
+      Enable crypto plugin
+    type: boolean
+    default: no
+  
+  plugin_crypto_id:
+    description: |
+      Crypto id
+    type: string
+    default: ""
+    example: bitcoin
+
+  plugin_crypto_vs_currency:
+    description: |
+      The target currency of market data (usd, eur, jpy, etc.)
+    type: string
+    default: "usd"
+    example: "usd"
+
+  plugin_crypto_days:
+    description: |
+      Data up to number of days ago (eg. 1,14,30,max)
+    type: string
+    default: "1"
+    example: 1
+
+  plugin_crypto_precision:
+    description: |
+      The number of decimal places to use
+    type: number
+    default: 2
+    example: 2
+
+
diff --git a/source/templates/classic/partials/_.json b/source/templates/classic/partials/_.json
index dcc317eb823..775c443328b 100644
--- a/source/templates/classic/partials/_.json
+++ b/source/templates/classic/partials/_.json
@@ -33,6 +33,7 @@
   "support",
   "stackoverflow",
   "leetcode",
+  "crypto",
   "stock",
   "achievements",
   "screenshot",
diff --git a/source/templates/classic/partials/crypto.ejs b/source/templates/classic/partials/crypto.ejs
new file mode 100644
index 00000000000..f98963f4d42
--- /dev/null
+++ b/source/templates/classic/partials/crypto.ejs
@@ -0,0 +1,68 @@
+<% if (plugins.crypto) { %>
+<section>
+	<h2 class="field">
+		<img width="20" src="<%= plugins.crypto.logo %>" />
+		<%= plugins.crypto.symbol ? `${plugins.crypto.symbol?.toUpperCase()}` : "" %>
+	</h2>
+	<% if (plugins.crypto.error) { %>
+	<div class="row fill-width">
+		<section>
+			<div class="field error">
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+					<path
+						fill-rule="evenodd"
+						d="M2.343 13.657A8 8 0 1113.657 2.343 8 8 0 012.343 13.657zM6.03 4.97a.75.75 0 00-1.06 1.06L6.94 8 4.97 9.97a.75.75 0 101.06 1.06L8 9.06l1.97 1.97a.75.75 0 101.06-1.06L9.06 8l1.97-1.97a.75.75 0 10-1.06-1.06L8 6.94 6.03 4.97z"
+					></path>
+				</svg>
+				<%= plugins.crypto.error.message %>
+			</div>
+		</section>
+	</div>
+	<% } else { %>
+	<div class="row">
+		<section>
+			<div class="field">
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+					<path
+						fill-rule="evenodd"
+						d="M6 2a.75.75 0 01.696.471L10 10.731l1.304-3.26A.75.75 0 0112 7h3.25a.75.75 0 010 1.5h-2.742l-1.812 4.528a.75.75 0 01-1.392 0L6 4.77 4.696 8.03A.75.75 0 014 8.5H.75a.75.75 0 010-1.5h2.742l1.812-4.529A.75.75 0 016 2z"
+					></path>
+				</svg>
+				<%= `${plugins.crypto.current_price.toFixed(plugins.crypto.precision || 2) } ${plugins.crypto.vs_currency?.toUpperCase()}` %>
+			</div>
+		</section>
+		<section>
+			<div class="field">
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+					<path
+						fill-rule="evenodd"
+						d="M4.75 0a.75.75 0 01.75.75V2h5V.75a.75.75 0 011.5 0V2h1.25c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0113.25 16H2.75A1.75 1.75 0 011 14.25V3.75C1 2.784 1.784 2 2.75 2H4V.75A.75.75 0 014.75 0zm0 3.5h8.5a.25.25 0 01.25.25V6h-11V3.75a.25.25 0 01.25-.25h2zm-2.25 4v6.75c0 .138.112.25.25.25h10.5a.25.25 0 00.25-.25V7.5h-11z"
+					></path>
+				</svg>
+				<%= plugins.crypto.days %>
+			</div>
+		</section>
+		<section>
+			<div class="field">
+				<% if (plugins.crypto.price_change_percentage_24h > 0) { %>
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+					<path
+						fill-rule="evenodd"
+						d="M3.47 7.78a.75.75 0 010-1.06l4.25-4.25a.75.75 0 011.06 0l4.25 4.25a.75.75 0 01-1.06 1.06L9 4.81v7.44a.75.75 0 01-1.5 0V4.81L4.53 7.78a.75.75 0 01-1.06 0z"
+					></path>
+				</svg>
+				<% } else { %>
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+					<path
+						fill-rule="evenodd"
+						d="M13.03 8.22a.75.75 0 010 1.06l-4.25 4.25a.75.75 0 01-1.06 0L3.47 9.28a.75.75 0 011.06-1.06l2.97 2.97V3.75a.75.75 0 011.5 0v7.44l2.97-2.97a.75.75 0 011.06 0z"
+					></path>
+				</svg>
+				<% } %> <%= plugins.crypto.price_change_percentage_24h ?plugins.crypto.price_change_percentage_24h.toFixed(2) : 0 %>%
+			</div>
+		</section>
+	</div>
+	<div class="crypto-chart"><%- plugins.crypto.chart %></div>
+	<% } %>
+</section>
+<% } %>
diff --git a/source/templates/repository/partials/_.json b/source/templates/repository/partials/_.json
index 67a63c08e74..2422896dfc7 100644
--- a/source/templates/repository/partials/_.json
+++ b/source/templates/repository/partials/_.json
@@ -12,6 +12,7 @@
   "rss",
   "screenshot",
   "stock",
+  "crypto",
   "contributors",
   "sponsors",
   "licenses"

From d75fc5fbde0a3fe63e8704d77ce3ca86358b50e0 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Wed, 11 Oct 2023 00:54:51 +0000
Subject: [PATCH 190/196] fix: add missing partial

---
 .../templates/repository/partials/crypto.ejs  | 68 +++++++++++++++++++
 1 file changed, 68 insertions(+)
 create mode 100644 source/templates/repository/partials/crypto.ejs

diff --git a/source/templates/repository/partials/crypto.ejs b/source/templates/repository/partials/crypto.ejs
new file mode 100644
index 00000000000..f98963f4d42
--- /dev/null
+++ b/source/templates/repository/partials/crypto.ejs
@@ -0,0 +1,68 @@
+<% if (plugins.crypto) { %>
+<section>
+	<h2 class="field">
+		<img width="20" src="<%= plugins.crypto.logo %>" />
+		<%= plugins.crypto.symbol ? `${plugins.crypto.symbol?.toUpperCase()}` : "" %>
+	</h2>
+	<% if (plugins.crypto.error) { %>
+	<div class="row fill-width">
+		<section>
+			<div class="field error">
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+					<path
+						fill-rule="evenodd"
+						d="M2.343 13.657A8 8 0 1113.657 2.343 8 8 0 012.343 13.657zM6.03 4.97a.75.75 0 00-1.06 1.06L6.94 8 4.97 9.97a.75.75 0 101.06 1.06L8 9.06l1.97 1.97a.75.75 0 101.06-1.06L9.06 8l1.97-1.97a.75.75 0 10-1.06-1.06L8 6.94 6.03 4.97z"
+					></path>
+				</svg>
+				<%= plugins.crypto.error.message %>
+			</div>
+		</section>
+	</div>
+	<% } else { %>
+	<div class="row">
+		<section>
+			<div class="field">
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+					<path
+						fill-rule="evenodd"
+						d="M6 2a.75.75 0 01.696.471L10 10.731l1.304-3.26A.75.75 0 0112 7h3.25a.75.75 0 010 1.5h-2.742l-1.812 4.528a.75.75 0 01-1.392 0L6 4.77 4.696 8.03A.75.75 0 014 8.5H.75a.75.75 0 010-1.5h2.742l1.812-4.529A.75.75 0 016 2z"
+					></path>
+				</svg>
+				<%= `${plugins.crypto.current_price.toFixed(plugins.crypto.precision || 2) } ${plugins.crypto.vs_currency?.toUpperCase()}` %>
+			</div>
+		</section>
+		<section>
+			<div class="field">
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+					<path
+						fill-rule="evenodd"
+						d="M4.75 0a.75.75 0 01.75.75V2h5V.75a.75.75 0 011.5 0V2h1.25c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0113.25 16H2.75A1.75 1.75 0 011 14.25V3.75C1 2.784 1.784 2 2.75 2H4V.75A.75.75 0 014.75 0zm0 3.5h8.5a.25.25 0 01.25.25V6h-11V3.75a.25.25 0 01.25-.25h2zm-2.25 4v6.75c0 .138.112.25.25.25h10.5a.25.25 0 00.25-.25V7.5h-11z"
+					></path>
+				</svg>
+				<%= plugins.crypto.days %>
+			</div>
+		</section>
+		<section>
+			<div class="field">
+				<% if (plugins.crypto.price_change_percentage_24h > 0) { %>
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+					<path
+						fill-rule="evenodd"
+						d="M3.47 7.78a.75.75 0 010-1.06l4.25-4.25a.75.75 0 011.06 0l4.25 4.25a.75.75 0 01-1.06 1.06L9 4.81v7.44a.75.75 0 01-1.5 0V4.81L4.53 7.78a.75.75 0 01-1.06 0z"
+					></path>
+				</svg>
+				<% } else { %>
+				<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+					<path
+						fill-rule="evenodd"
+						d="M13.03 8.22a.75.75 0 010 1.06l-4.25 4.25a.75.75 0 01-1.06 0L3.47 9.28a.75.75 0 011.06-1.06l2.97 2.97V3.75a.75.75 0 011.5 0v7.44l2.97-2.97a.75.75 0 011.06 0z"
+					></path>
+				</svg>
+				<% } %> <%= plugins.crypto.price_change_percentage_24h ?plugins.crypto.price_change_percentage_24h.toFixed(2) : 0 %>%
+			</div>
+		</section>
+	</div>
+	<div class="crypto-chart"><%- plugins.crypto.chart %></div>
+	<% } %>
+</section>
+<% } %>

From 08f1719ee04c317c2650baa482d1d0f5b9a53655 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Tue, 31 Oct 2023 06:24:59 +0100
Subject: [PATCH 191/196] chore(deps): disable npm dependabot as v4 won't use
 npm anymore

---
 .github/dependabot.yml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 11aa142e8dd..2cabb80366b 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,6 +1,7 @@
 version: 2
 updates:
   - package-ecosystem: npm
+    open-pull-requests-limit: 0 # Will not be managed by npm anymore in v4
     labels:
       - 📦 dependencies
     directory: /

From 84df066c49f245391b0298a9184dfbdae6650327 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Nov 2023 20:39:30 -0500
Subject: [PATCH 192/196] Update .gitignore

---
 .gitignore | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/.gitignore b/.gitignore
index 44177cc675b..dffcc2b2530 100644
--- a/.gitignore
+++ b/.gitignore
@@ -114,4 +114,12 @@ source/templates/@*
 source/app/web/statics/preview
 
 # Presets
-.presets
\ No newline at end of file
+.presets
+
+# V4
+.deno-make.json
+.coverage
+.secrets
+.test
+source/run/serve/static/app.js
+metrics.config.yml
\ No newline at end of file

From 13a071e529c43fb185663863364edbea7548b075 Mon Sep 17 00:00:00 2001
From: Simon Lecoq <22963968+lowlighter@users.noreply.github.com>
Date: Mon, 13 Nov 2023 20:46:03 -0500
Subject: [PATCH 193/196] chore: rebuild files

---
 README.md                                    | 21 +++++++++++++----
 action.yml                                   | 23 +++++++++++++++++++
 settings.example.json                        |  3 +++
 source/plugins/README.md                     |  1 +
 source/plugins/community/README.md           | 24 ++++++++++++++------
 source/plugins/community/crypto/README.md    |  2 +-
 source/plugins/community/crypto/examples.yml |  2 ++
 source/templates/classic/README.md           |  2 +-
 source/templates/repository/README.md        |  2 +-
 tests/cases/crypto.plugin.yml                |  1 +
 10 files changed, 66 insertions(+), 15 deletions(-)
 create mode 100644 tests/cases/crypto.plugin.yml

diff --git a/README.md b/README.md
index 2adbfbc74e2..530774be669 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
   </tr>
   <tr>
     <th colspan="2" align="center">
-      <h3><a href="/README.md#-plugins">🧩 Customizable with 46 plugins and 330 options!</a></h3>
+      <h3><a href="/README.md#-plugins">🧩 Customizable with 47 plugins and 335 options!</a></h3>
     </th>
   </tr>
   <tr>
@@ -323,46 +323,56 @@ Generate metrics that can be embedded everywhere, including your GitHub profile
     </th>
   </tr>
   <tr>
+    <th><a href="source/plugins/community/crypto/README.md">🪙 Crypto</a><br><sup>by <a href="https://github.com/dajneem23">@dajneem23</a></sup>
+      <details><summary>Render example</summary>
+        <img alt="" width="400" src="https://via.placeholder.com/468x60?text=No%20preview%20available" alt=""></img>
+        <img width="900" height="1" alt="">
+      </details>
+    </th>
     <th><a href="source/plugins/community/fortune/README.md">🥠 Fortune</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.fortune.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
+  </tr>
+  <tr>
     <th><a href="source/plugins/community/nightscout/README.md">💉 Nightscout</a><br><sup>by <a href="https://github.com/legoandmars">@legoandmars</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/legoandmars/legoandmars/blob/master/metrics.plugin.nightscout.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
-  </tr>
-  <tr>
     <th><a href="source/plugins/community/poopmap/README.md">💩 PoopMap plugin</a><br><sup>by <a href="https://github.com/matievisthekat">@matievisthekat</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/matievisthekat/matievisthekat/blob/master/metrics.plugin.poopmap.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
+  </tr>
+  <tr>
     <th><a href="source/plugins/community/screenshot/README.md">📸 Website screenshot</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.screenshot.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
-  </tr>
-  <tr>
     <th><a href="source/plugins/community/splatoon/README.md">🦑 Splatoon</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.splatoon.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
+  </tr>
+  <tr>
     <th><a href="source/plugins/community/stock/README.md">💹 Stock prices</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup>
       <details><summary>Render example</summary>
         <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stock.svg" alt=""></img>
         <img width="900" height="1" alt="">
       </details>
     </th>
+    <th>
+    </th>
   </tr>
   <tr>
     <th colspan="2" align="center">
@@ -527,6 +537,7 @@ Plugins provide additional content and lets you customize rendered metrics.
 * **[Community plugins](/source/plugins/community/README.md)**
   * [🧠 16personalities <sub>`16personalities`</sub>](/source/plugins/community/16personalities/README.md) by [@lowlighter](https://github.com/lowlighter)
   * [♟️ Chess <sub>`chess`</sub>](/source/plugins/community/chess/README.md) by [@lowlighter](https://github.com/lowlighter)
+  * [🪙 Crypto <sub>`crypto`</sub>](/source/plugins/community/crypto/README.md) by [@dajneem23](https://github.com/dajneem23)
   * [🥠 Fortune <sub>`fortune`</sub>](/source/plugins/community/fortune/README.md) by [@lowlighter](https://github.com/lowlighter)
   * [💉 Nightscout <sub>`nightscout`</sub>](/source/plugins/community/nightscout/README.md) by [@legoandmars](https://github.com/legoandmars)
   * [💩 PoopMap plugin <sub>`poopmap`</sub>](/source/plugins/community/poopmap/README.md) by [@matievisthekat](https://github.com/matievisthekat)
diff --git a/action.yml b/action.yml
index ba2ab546ff5..a1c037d003f 100644
--- a/action.yml
+++ b/action.yml
@@ -1322,6 +1322,29 @@ inputs:
     description: Animation settings
     default: <default-value>
 
+  # ====================================================================================
+  # 🪙 Crypto
+
+  plugin_crypto:
+    description: Enable crypto plugin
+    default: <default-value>
+
+  plugin_crypto_id:
+    description: Crypto id
+    default: <default-value>
+
+  plugin_crypto_vs_currency:
+    description: The target currency of market data (usd, eur, jpy, etc.)
+    default: <default-value>
+
+  plugin_crypto_days:
+    description: Data up to number of days ago (eg. 1,14,30,max)
+    default: <default-value>
+
+  plugin_crypto_precision:
+    description: The number of decimal places to use
+    default: <default-value>
+
   # ====================================================================================
   # 🥠 Fortune
 
diff --git a/settings.example.json b/settings.example.json
index c329ef1444e..07743c3fa42 100644
--- a/settings.example.json
+++ b/settings.example.json
@@ -191,6 +191,9 @@
       "token": "Chess platform token",
       "enabled": false,                 "//": "Enable chess plugin"
     },
+    "crypto":{
+      "enabled": false,                 "//": "Enable crypto plugin"
+    },
     "fortune":{
       "enabled": false,                 "//": "Enable fortune plugin"
     },
diff --git a/source/plugins/README.md b/source/plugins/README.md
index 149282f912c..31a4c96a240 100644
--- a/source/plugins/README.md
+++ b/source/plugins/README.md
@@ -52,6 +52,7 @@ Plugins provide additional content and lets you customize rendered metrics.
 * **[Community plugins](/source/plugins/community/README.md)**
   * [🧠 16personalities <sub>`16personalities`</sub>](/source/plugins/community/16personalities/README.md) by [@lowlighter](https://github.com/lowlighter)
   * [♟️ Chess <sub>`chess`</sub>](/source/plugins/community/chess/README.md) by [@lowlighter](https://github.com/lowlighter)
+  * [🪙 Crypto <sub>`crypto`</sub>](/source/plugins/community/crypto/README.md) by [@dajneem23](https://github.com/dajneem23)
   * [🥠 Fortune <sub>`fortune`</sub>](/source/plugins/community/fortune/README.md) by [@lowlighter](https://github.com/lowlighter)
   * [💉 Nightscout <sub>`nightscout`</sub>](/source/plugins/community/nightscout/README.md) by [@legoandmars](https://github.com/legoandmars)
   * [💩 PoopMap plugin <sub>`poopmap`</sub>](/source/plugins/community/poopmap/README.md) by [@matievisthekat](https://github.com/matievisthekat)
diff --git a/source/plugins/community/README.md b/source/plugins/community/README.md
index 8c64563e959..7d6a0832bba 100644
--- a/source/plugins/community/README.md
+++ b/source/plugins/community/README.md
@@ -16,44 +16,54 @@
       <img width="900" height="1" alt="">
     </td>
   </tr>  <tr>
+    <th><a href="/source/plugins/community/crypto/README.md">🪙 Crypto</a><br><sup>by <a href="https://github.com/dajneem23">@dajneem23</a></sup></th>
     <th><a href="/source/plugins/community/fortune/README.md">🥠 Fortune</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
-    <th><a href="/source/plugins/community/nightscout/README.md">💉 Nightscout</a><br><sup>by <a href="https://github.com/legoandmars">@legoandmars</a></sup></th>
   </tr>
   <tr>
     <td  align="center">
-      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.fortune.svg" alt=""></img>
+      <img alt="" width="400" src="https://via.placeholder.com/468x60?text=No%20preview%20available" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
     <td  align="center">
-      <img alt="" width="400" src="https://github.com/legoandmars/legoandmars/blob/master/metrics.plugin.nightscout.svg" alt=""></img>
+      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.fortune.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
   </tr>  <tr>
+    <th><a href="/source/plugins/community/nightscout/README.md">💉 Nightscout</a><br><sup>by <a href="https://github.com/legoandmars">@legoandmars</a></sup></th>
     <th><a href="/source/plugins/community/poopmap/README.md">💩 PoopMap plugin</a><br><sup>by <a href="https://github.com/matievisthekat">@matievisthekat</a></sup></th>
-    <th><a href="/source/plugins/community/screenshot/README.md">📸 Website screenshot</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
   </tr>
   <tr>
     <td  align="center">
-      <img alt="" width="400" src="https://github.com/matievisthekat/matievisthekat/blob/master/metrics.plugin.poopmap.svg" alt=""></img>
+      <img alt="" width="400" src="https://github.com/legoandmars/legoandmars/blob/master/metrics.plugin.nightscout.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
     <td  align="center">
-      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.screenshot.svg" alt=""></img>
+      <img alt="" width="400" src="https://github.com/matievisthekat/matievisthekat/blob/master/metrics.plugin.poopmap.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
   </tr>  <tr>
+    <th><a href="/source/plugins/community/screenshot/README.md">📸 Website screenshot</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
     <th><a href="/source/plugins/community/splatoon/README.md">🦑 Splatoon</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
-    <th><a href="/source/plugins/community/stock/README.md">💹 Stock prices</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
   </tr>
   <tr>
+    <td  align="center">
+      <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.screenshot.svg" alt=""></img>
+      <img width="900" height="1" alt="">
+    </td>
     <td  align="center">
       <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.splatoon.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
+  </tr>  <tr>
+    <th><a href="/source/plugins/community/stock/README.md">💹 Stock prices</a><br><sup>by <a href="https://github.com/lowlighter">@lowlighter</a></sup></th>
+    <th></th>
+  </tr>
+  <tr>
     <td  align="center">
       <img alt="" width="400" src="https://github.com/lowlighter/metrics/blob/examples/metrics.plugin.stock.svg" alt=""></img>
       <img width="900" height="1" alt="">
     </td>
+<td align="center"><img width="900" height="1" alt=""></td>
   </tr>
 </table>
 
diff --git a/source/plugins/community/crypto/README.md b/source/plugins/community/crypto/README.md
index 948a99c5a29..393c04ac8aa 100644
--- a/source/plugins/community/crypto/README.md
+++ b/source/plugins/community/crypto/README.md
@@ -83,7 +83,6 @@
 <!-- /Options -->
 
 <!--examples-->
-
 ```yaml
 name: Crypto Metrics
 uses: lowlighter/metrics@latest
@@ -96,5 +95,6 @@ with:
   plugin_crypto_vs_currency: usd
   plugin_crypto_days: 1
   plugin_crypto_precision: 2
+
 ```
 <!--/examples-->
diff --git a/source/plugins/community/crypto/examples.yml b/source/plugins/community/crypto/examples.yml
index 50a861758e0..a227d3aa0c8 100644
--- a/source/plugins/community/crypto/examples.yml
+++ b/source/plugins/community/crypto/examples.yml
@@ -11,3 +11,5 @@
     plugin_crypto_precision: 2
   prod:
     skip: true
+  test:
+    skip: true
\ No newline at end of file
diff --git a/source/templates/classic/README.md b/source/templates/classic/README.md
index c91562c847e..ba74a3c9b81 100644
--- a/source/templates/classic/README.md
+++ b/source/templates/classic/README.md
@@ -7,7 +7,7 @@ This is also the default template.</p>
 </td></tr>
   <tr>
     <th rowspan="3">Supported features<br><sub><a href="metadata.yml">→ Full specification</a></sub></th>
-    <td><a href="/source/plugins/achievements/README.md" title="🏆 Achievements">🏆</a> <a href="/source/plugins/activity/README.md" title="📰 Recent activity">📰</a> <a href="/source/plugins/anilist/README.md" title="🌸 Anilist watch list and reading list">🌸</a> <a href="/source/plugins/calendar/README.md" title="📆 Commit calendar">📆</a> <a href="/source/plugins/code/README.md" title="♐ Random code snippet">♐</a> <a href="/source/plugins/16personalities/README.md" title="🧠 16personalities">🧠</a> <a href="/source/plugins/chess/README.md" title="♟️ Chess">♟️</a> <a href="/source/plugins/fortune/README.md" title="🥠 Fortune">🥠</a> <a href="/source/plugins/nightscout/README.md" title="💉 Nightscout">💉</a> <a href="/source/plugins/poopmap/README.md" title="💩 PoopMap plugin">💩</a> <a href="/source/plugins/screenshot/README.md" title="📸 Website screenshot">📸</a> <a href="/source/plugins/splatoon/README.md" title="🦑 Splatoon">🦑</a> <a href="/source/plugins/stock/README.md" title="💹 Stock prices">💹</a> <a href="/source/plugins/discussions/README.md" title="💬 Discussions">💬</a> <a href="/source/plugins/followup/README.md" title="🎟️ Follow-up of issues and pull requests">🎟️</a> <a href="/source/plugins/gists/README.md" title="🎫 Gists">🎫</a> <a href="/source/plugins/habits/README.md" title="💡 Coding habits and activity">💡</a> <a href="/source/plugins/introduction/README.md" title="🙋 Introduction">🙋</a> <a href="/source/plugins/isocalendar/README.md" title="📅 Isometric commit calendar">📅</a> <a href="/source/plugins/languages/README.md" title="🈷️ Languages activity">🈷️</a> <a href="/source/plugins/leetcode/README.md" title="🗳️ Leetcode">🗳️</a> <a href="/source/plugins/lines/README.md" title="👨‍💻 Lines of code changed">👨‍💻</a> <a href="/source/plugins/music/README.md" title="🎼 Music activity and suggestions">🎼</a> <a href="/source/plugins/notable/README.md" title="🎩 Notable contributions">🎩</a> <a href="/source/plugins/pagespeed/README.md" title="⏱️ Google PageSpeed">⏱️</a> <a href="/source/plugins/people/README.md" title="🧑‍🤝‍🧑 People">🧑‍🤝‍🧑</a> <a href="/source/plugins/posts/README.md" title="✒️ Recent posts">✒️</a> <a href="/source/plugins/projects/README.md" title="🗂️ GitHub projects">🗂️</a> <a href="/source/plugins/reactions/README.md" title="🎭 Comment reactions">🎭</a> <a href="/source/plugins/repositories/README.md" title="📓 Featured repositories">📓</a> <a href="/source/plugins/rss/README.md" title="🗼 Rss feed">🗼</a> <a href="/source/plugins/skyline/README.md" title="🌇 GitHub Skyline">🌇</a> <a href="/source/plugins/sponsors/README.md" title="💕 GitHub Sponsors">💕</a> <a href="/source/plugins/sponsorships/README.md" title="💝 GitHub Sponsorships">💝</a> <a href="/source/plugins/stackoverflow/README.md" title="🗨️ Stack Overflow">🗨️</a> <a href="/source/plugins/stargazers/README.md" title="✨ Stargazers">✨</a> <a href="/source/plugins/starlists/README.md" title="💫 Star lists">💫</a> <a href="/source/plugins/stars/README.md" title="🌟 Recently starred repositories">🌟</a> <a href="/source/plugins/steam/README.md" title="🕹️ Steam">🕹️</a> <a href="/source/plugins/support/README.md" title="💭 GitHub Community Support">💭</a> <a href="/source/plugins/topics/README.md" title="📌 Starred topics">📌</a> <a href="/source/plugins/traffic/README.md" title="🧮 Repositories traffic">🧮</a> <a href="/source/plugins/tweets/README.md" title="🐤 Latest tweets">🐤</a> <a href="/source/plugins/wakatime/README.md" title="⏰ WakaTime">⏰</a></td>
+    <td><a href="/source/plugins/achievements/README.md" title="🏆 Achievements">🏆</a> <a href="/source/plugins/activity/README.md" title="📰 Recent activity">📰</a> <a href="/source/plugins/anilist/README.md" title="🌸 Anilist watch list and reading list">🌸</a> <a href="/source/plugins/calendar/README.md" title="📆 Commit calendar">📆</a> <a href="/source/plugins/code/README.md" title="♐ Random code snippet">♐</a> <a href="/source/plugins/16personalities/README.md" title="🧠 16personalities">🧠</a> <a href="/source/plugins/chess/README.md" title="♟️ Chess">♟️</a> <a href="/source/plugins/crypto/README.md" title="🪙 Crypto">🪙</a> <a href="/source/plugins/fortune/README.md" title="🥠 Fortune">🥠</a> <a href="/source/plugins/nightscout/README.md" title="💉 Nightscout">💉</a> <a href="/source/plugins/poopmap/README.md" title="💩 PoopMap plugin">💩</a> <a href="/source/plugins/screenshot/README.md" title="📸 Website screenshot">📸</a> <a href="/source/plugins/splatoon/README.md" title="🦑 Splatoon">🦑</a> <a href="/source/plugins/stock/README.md" title="💹 Stock prices">💹</a> <a href="/source/plugins/discussions/README.md" title="💬 Discussions">💬</a> <a href="/source/plugins/followup/README.md" title="🎟️ Follow-up of issues and pull requests">🎟️</a> <a href="/source/plugins/gists/README.md" title="🎫 Gists">🎫</a> <a href="/source/plugins/habits/README.md" title="💡 Coding habits and activity">💡</a> <a href="/source/plugins/introduction/README.md" title="🙋 Introduction">🙋</a> <a href="/source/plugins/isocalendar/README.md" title="📅 Isometric commit calendar">📅</a> <a href="/source/plugins/languages/README.md" title="🈷️ Languages activity">🈷️</a> <a href="/source/plugins/leetcode/README.md" title="🗳️ Leetcode">🗳️</a> <a href="/source/plugins/lines/README.md" title="👨‍💻 Lines of code changed">👨‍💻</a> <a href="/source/plugins/music/README.md" title="🎼 Music activity and suggestions">🎼</a> <a href="/source/plugins/notable/README.md" title="🎩 Notable contributions">🎩</a> <a href="/source/plugins/pagespeed/README.md" title="⏱️ Google PageSpeed">⏱️</a> <a href="/source/plugins/people/README.md" title="🧑‍🤝‍🧑 People">🧑‍🤝‍🧑</a> <a href="/source/plugins/posts/README.md" title="✒️ Recent posts">✒️</a> <a href="/source/plugins/projects/README.md" title="🗂️ GitHub projects">🗂️</a> <a href="/source/plugins/reactions/README.md" title="🎭 Comment reactions">🎭</a> <a href="/source/plugins/repositories/README.md" title="📓 Featured repositories">📓</a> <a href="/source/plugins/rss/README.md" title="🗼 Rss feed">🗼</a> <a href="/source/plugins/skyline/README.md" title="🌇 GitHub Skyline">🌇</a> <a href="/source/plugins/sponsors/README.md" title="💕 GitHub Sponsors">💕</a> <a href="/source/plugins/sponsorships/README.md" title="💝 GitHub Sponsorships">💝</a> <a href="/source/plugins/stackoverflow/README.md" title="🗨️ Stack Overflow">🗨️</a> <a href="/source/plugins/stargazers/README.md" title="✨ Stargazers">✨</a> <a href="/source/plugins/starlists/README.md" title="💫 Star lists">💫</a> <a href="/source/plugins/stars/README.md" title="🌟 Recently starred repositories">🌟</a> <a href="/source/plugins/steam/README.md" title="🕹️ Steam">🕹️</a> <a href="/source/plugins/support/README.md" title="💭 GitHub Community Support">💭</a> <a href="/source/plugins/topics/README.md" title="📌 Starred topics">📌</a> <a href="/source/plugins/traffic/README.md" title="🧮 Repositories traffic">🧮</a> <a href="/source/plugins/tweets/README.md" title="🐤 Latest tweets">🐤</a> <a href="/source/plugins/wakatime/README.md" title="⏰ WakaTime">⏰</a></td>
   </tr>
   <tr>
     <td><code>👤 Users</code> <code>👥 Organizations</code></td>
diff --git a/source/templates/repository/README.md b/source/templates/repository/README.md
index c6c86d8639c..508642c7f64 100644
--- a/source/templates/repository/README.md
+++ b/source/templates/repository/README.md
@@ -6,7 +6,7 @@
 </td></tr>
   <tr>
     <th rowspan="3">Supported features<br><sub><a href="metadata.yml">→ Full specification</a></sub></th>
-    <td><a href="/source/plugins/activity/README.md" title="📰 Recent activity">📰</a> <a href="/source/plugins/screenshot/README.md" title="📸 Website screenshot">📸</a> <a href="/source/plugins/stock/README.md" title="💹 Stock prices">💹</a> <a href="/source/plugins/contributors/README.md" title="🏅 Repository contributors">🏅</a> <a href="/source/plugins/followup/README.md" title="🎟️ Follow-up of issues and pull requests">🎟️</a> <a href="/source/plugins/introduction/README.md" title="🙋 Introduction">🙋</a> <a href="/source/plugins/languages/README.md" title="🈷️ Languages activity">🈷️</a> <a href="/source/plugins/licenses/README.md" title="📜 Repository licenses">📜</a> <a href="/source/plugins/lines/README.md" title="👨‍💻 Lines of code changed">👨‍💻</a> <a href="/source/plugins/pagespeed/README.md" title="⏱️ Google PageSpeed">⏱️</a> <a href="/source/plugins/people/README.md" title="🧑‍🤝‍🧑 People">🧑‍🤝‍🧑</a> <a href="/source/plugins/posts/README.md" title="✒️ Recent posts">✒️</a> <a href="/source/plugins/projects/README.md" title="🗂️ GitHub projects">🗂️</a> <a href="/source/plugins/rss/README.md" title="🗼 Rss feed">🗼</a> <a href="/source/plugins/sponsors/README.md" title="💕 GitHub Sponsors">💕</a> <a href="/source/plugins/stargazers/README.md" title="✨ Stargazers">✨</a> <a href="/source/plugins/traffic/README.md" title="🧮 Repositories traffic">🧮</a></td>
+    <td><a href="/source/plugins/activity/README.md" title="📰 Recent activity">📰</a> <a href="/source/plugins/crypto/README.md" title="🪙 Crypto">🪙</a> <a href="/source/plugins/screenshot/README.md" title="📸 Website screenshot">📸</a> <a href="/source/plugins/stock/README.md" title="💹 Stock prices">💹</a> <a href="/source/plugins/contributors/README.md" title="🏅 Repository contributors">🏅</a> <a href="/source/plugins/followup/README.md" title="🎟️ Follow-up of issues and pull requests">🎟️</a> <a href="/source/plugins/introduction/README.md" title="🙋 Introduction">🙋</a> <a href="/source/plugins/languages/README.md" title="🈷️ Languages activity">🈷️</a> <a href="/source/plugins/licenses/README.md" title="📜 Repository licenses">📜</a> <a href="/source/plugins/lines/README.md" title="👨‍💻 Lines of code changed">👨‍💻</a> <a href="/source/plugins/pagespeed/README.md" title="⏱️ Google PageSpeed">⏱️</a> <a href="/source/plugins/people/README.md" title="🧑‍🤝‍🧑 People">🧑‍🤝‍🧑</a> <a href="/source/plugins/posts/README.md" title="✒️ Recent posts">✒️</a> <a href="/source/plugins/projects/README.md" title="🗂️ GitHub projects">🗂️</a> <a href="/source/plugins/rss/README.md" title="🗼 Rss feed">🗼</a> <a href="/source/plugins/sponsors/README.md" title="💕 GitHub Sponsors">💕</a> <a href="/source/plugins/stargazers/README.md" title="✨ Stargazers">✨</a> <a href="/source/plugins/traffic/README.md" title="🧮 Repositories traffic">🧮</a></td>
   </tr>
   <tr>
     <td><code>📓 Repositories</code></td>
diff --git a/tests/cases/crypto.plugin.yml b/tests/cases/crypto.plugin.yml
new file mode 100644
index 00000000000..fe51488c706
--- /dev/null
+++ b/tests/cases/crypto.plugin.yml
@@ -0,0 +1 @@
+[]

From a53a5853a99509233cdef4b056411facc481b833 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Tue, 14 Nov 2023 02:26:48 +0000
Subject: [PATCH 194/196] chore: code formatting

---
 source/plugins/community/crypto/index.mjs | 50 +++++++++++------------
 1 file changed, 23 insertions(+), 27 deletions(-)

diff --git a/source/plugins/community/crypto/index.mjs b/source/plugins/community/crypto/index.mjs
index 9f2f9f80c86..ba531efa0e3 100644
--- a/source/plugins/community/crypto/index.mjs
+++ b/source/plugins/community/crypto/index.mjs
@@ -6,63 +6,60 @@ export default async function({login, q, imports, data, account}, {enabled = fal
     if ((!q.crypto) || (!imports.metadata.plugins.crypto.enabled(enabled, {extras})))
       return null
 
-        //Load inputs
-    let {id, days, vs_currency, precision } = imports.metadata.plugins.crypto.inputs({data, account, q})
+    //Load inputs
+    let {id, days, vs_currency, precision} = imports.metadata.plugins.crypto.inputs({data, account, q})
     if (!id)
-      throw { error: { message: "Crypto currency id is not set" } }
+      throw {error: {message: "Crypto currency id is not set"}}
 
     console.debug(`metrics/compute/${login}/plugins > crypto > querying api for crypto`)
 
     const {
-      data: coin
-    } = await imports.axios.get(`https://api.coingecko.com/api/v3/coins/${id}`,
-      {
-        params: {
-          market_data:true
-        }
-      })
+      data: coin,
+    } = await imports.axios.get(`https://api.coingecko.com/api/v3/coins/${id}`, {
+      params: {
+        market_data: true,
+      },
+    })
 
-    if (!coin) {
+    if (!coin)
       throw {error: {message: "Crypto currency not found"}}
-    }
 
     const {
-    data: { prices },
-   } = await imports.axios.get(`https://api.coingecko.com/api/v3/coins/${id}/market_chart`, {
+      data: {prices},
+    } = await imports.axios.get(`https://api.coingecko.com/api/v3/coins/${id}/market_chart`, {
       params: {
-       vs_currency,
-       days,
-       precision
+        vs_currency,
+        days,
+        precision,
       },
-   })
-
+    })
 
     const chart = imports.Graph.timeline(
-      prices.map((y, _) => ({ x: new Date(y[0]), y: y[1] })),
+      prices.map((y, _) => ({x: new Date(y[0]), y: y[1]})),
       {
         low: Math.min(...prices.map((y, _) => y[1])),
 
         high: Math.max(...prices.map((y, _) => y[1])),
 
-        points: false, text: false,
+        points: false,
+        text: false,
         width: 480 * (1 + data.large),
-        height: 200
-      }
+        height: 200,
+      },
     )
 
-
     //Results
     return {
       chart,
       id,
       precision,
-      days:{"1":"Today", "14":"2 Weeks", "30":"1 Month", max :"All-time"}[days],
+      days: {"1": "Today", "14": "2 Weeks", "30": "1 Month", max: "All-time"}[days],
       symbol: coin.symbol,
       name: coin.name,
       current_price: coin.market_data.current_price[vs_currency],
       price_change_percentage_24h: coin.market_data.price_change_percentage_24h,
       vs_currency,
-      logo:coin.image.small,
+      logo: coin.image.small,
     }
   }
   //Handle errors
@@ -70,4 +67,3 @@ export default async function({login, q, imports, data, account}, {enabled = fal
     throw imports.format.error(error)
   }
 }
-

From 995dd4a8e1f60d8f140c214cd197a15b317049ef Mon Sep 17 00:00:00 2001
From: Ilan <39036916+ilanRosenbaum@users.noreply.github.com>
Date: Mon, 18 Dec 2023 11:01:01 -0600
Subject: [PATCH 195/196] fix(plugins/languages): support for private
 repositories (#1579)

---
 source/plugins/languages/analyzer/analyzer.mjs | 17 ++++++++++++-----
 1 file changed, 12 insertions(+), 5 deletions(-)

diff --git a/source/plugins/languages/analyzer/analyzer.mjs b/source/plugins/languages/analyzer/analyzer.mjs
index 529a367e5cf..e0042cb1dc3 100644
--- a/source/plugins/languages/analyzer/analyzer.mjs
+++ b/source/plugins/languages/analyzer/analyzer.mjs
@@ -4,6 +4,7 @@ import os from "os"
 import paths from "path"
 import git from "simple-git"
 import { filters } from "../../../app/metrics/utils.mjs"
+import core from "@actions/core"
 
 /**Analyzer */
 export class Analyzer {
@@ -86,13 +87,19 @@ export class Analyzer {
   /**Clone a repository */
   async clone(repository) {
     const {repo, branch, path} = this.parse(repository)
-    let url = /^https?:\/\//.test(repo) ? repo : `https://github.com/${repo}`
+    let token
+
+    if (process.env.GITHUB_ACTIONS) {
+      token = core.getInput("token")
+    }
+
+    let url = /^https?:\/\//.test(repo) ? repo : `https://${token}@github.com/${repo}`
     try {
-      this.debug(`cloning ${url} to ${path}`)
+      this.debug(`cloning https://github.com/${repo} to ${path}`)
       await fs.rm(path, {recursive: true, force: true})
       await fs.mkdir(path, {recursive: true})
       await git(path).clone(url, ".", ["--single-branch"]).status()
-      this.debug(`cloned ${url} to ${path}`)
+      this.debug(`cloned https://github.com/${repo} to ${path}`)
       if (branch) {
         this.debug(`switching to branch ${branch} for ${repo}`)
         await git(path).branch(branch)
@@ -100,7 +107,7 @@ export class Analyzer {
       return true
     }
     catch (error) {
-      this.debug(`failed to clone ${url} (${error})`)
+      this.debug(`failed to clone https://github.com/${repo} (${error})`)
       this.clean(path)
       return false
     }
@@ -176,4 +183,4 @@ export class Analyzer {
   debug(message) {
     return console.debug(`metrics/compute/${this.login}/plugins > languages > ${this.constructor.name.replace(/([a-z])([A-Z])/, (_, a, b) => `${a} ${b.toLocaleLowerCase()}`).toLocaleLowerCase()} > ${message}`)
   }
-}
+}
\ No newline at end of file

From 366f8b9dfe3a59656c67d5dcad9950f59c9bc96d Mon Sep 17 00:00:00 2001
From: Nikos Kanakis <nikk@hotmail.gr>
Date: Mon, 18 Dec 2023 19:04:44 +0200
Subject: [PATCH 196/196] docs: make github action workflow more understandable
 (#1582) [skip ci]

---
 .../imgs/setup_repository_secret.dark.png     | Bin 32428 -> 90171 bytes
 .../imgs/setup_repository_secret.light.png    | Bin 33355 -> 90732 bytes
 .../partials/documentation/setup/action.md    |   2 ++
 3 files changed, 2 insertions(+)

diff --git a/.github/readme/imgs/setup_repository_secret.dark.png b/.github/readme/imgs/setup_repository_secret.dark.png
index 6cae665e4c06f6375da2e1640ff01ad56d798dd9..c1bab0ef91658efe5d35d41fe453728ecacf8d77 100644
GIT binary patch
diff --git a/.github/readme/imgs/setup_repository_secret.light.png b/.github/readme/imgs/setup_repository_secret.light.png
index cdecab517fe4b7a00a770cbbf99629cf8f11bd07..f4d54fcfbdd40450db18937c1a9e45bcb56db7cd 100644
GIT binary patch
diff --git a/.github/readme/partials/documentation/setup/action.md b/.github/readme/partials/documentation/setup/action.md
index e066c398359..320134ce2be 100644
--- a/.github/readme/partials/documentation/setup/action.md
+++ b/.github/readme/partials/documentation/setup/action.md
@@ -68,6 +68,8 @@ on:
 jobs:
   github-metrics:
     runs-on: ubuntu-latest
+    environment: 
+      name: production
     permissions:
       contents: write
     steps:
