From 1b0ef2d227f12ba775e9c8e90c6751970069d686 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Wed, 19 Feb 2025 19:10:42 +0530
Subject: [PATCH 01/17] mirror-url -implementation

---
 __tests__/canary-installer.test.ts            | 158 +++++++++-
 __tests__/main.test.ts                        |  95 ++++++
 __tests__/nightly-installer.test.ts           | 140 ++++++++-
 __tests__/official-installer.test.ts          | 142 ++++++++-
 __tests__/rc-installer.test.ts                | 185 ++++++++++-
 dist/setup/index.js                           | 286 ++++++++++++++----
 src/distributions/base-distribution.ts        |  78 ++++-
 src/distributions/base-models.ts              |   1 +
 src/distributions/nightly/nightly_builds.ts   |  18 +-
 .../official_builds/official_builds.ts        | 234 ++++++++------
 src/distributions/rc/rc_builds.ts             |  24 +-
 src/distributions/v8-canary/canary_builds.ts  |  17 +-
 src/main.ts                                   |   5 +-
 13 files changed, 1211 insertions(+), 172 deletions(-)

diff --git a/__tests__/canary-installer.test.ts b/__tests__/canary-installer.test.ts
index 6d141fc3c..ef38c7141 100644
--- a/__tests__/canary-installer.test.ts
+++ b/__tests__/canary-installer.test.ts
@@ -10,13 +10,14 @@ import osm from 'os';
 import path from 'path';
 import * as main from '../src/main';
 import * as auth from '../src/authutil';
-import {INodeVersion} from '../src/distributions/base-models';
+import {INodeVersion, NodeInputs} from '../src/distributions/base-models';
 
 import nodeTestManifest from './data/versions-manifest.json';
 import nodeTestDist from './data/node-dist-index.json';
 import nodeTestDistNightly from './data/node-nightly-index.json';
 import nodeTestDistRc from './data/node-rc-index.json';
 import nodeV8CanaryTestDist from './data/v8-canary-dist-index.json';
+import canaryBuild from '../src/distributions/v8-canary/canary_builds';
 
 describe('setup-node', () => {
   let inputs = {} as any;
@@ -528,4 +529,159 @@ describe('setup-node', () => {
       expect(cacheSpy).not.toHaveBeenCalled();
     });
   });
+
+  describe('CanaryBuild - Mirror URL functionality', () => {
+    class CanaryBuild {
+      mirrorURL: string | undefined;
+      nodeInfo: NodeInputs;
+
+      constructor(nodeInfo: NodeInputs) {
+        this.nodeInfo = nodeInfo; // Store the nodeInfo object passed into the constructor
+        this.mirrorURL = nodeInfo.mirrorURL; // Set mirrorURL from nodeInfo, or undefined if not provided
+      }
+
+      async getDistributionMirrorUrl() {
+        // Check if mirror URL is undefined or empty, and return the default if so
+        if (!this.mirrorURL) {
+          core.info('Using mirror URL: https://nodejs.org/download/v8-canary');
+          return 'https://nodejs.org/download/v8-canary'; // Default URL
+        } else {
+          if (this.mirrorURL === '') {
+            throw new Error(
+              'Mirror URL is empty. Please provide a valid mirror URL.'
+            );
+          }
+          return this.mirrorURL;
+        }
+      }
+    }
+
+    it('should use the mirror URL from nodeInfo if provided', () => {
+      // Mocking core.info to track the log calls
+      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
+
+      const mirrorURL = 'https://custom.mirror.url/v8-canary';
+      const nodeInfo: NodeInputs = {
+        versionSpec: '8.0.0-canary',
+        arch: 'x64',
+        checkLatest: false,
+        stable: false,
+        mirrorURL: mirrorURL // Provide the custom mirror URL
+      };
+
+      const canaryBuild = new CanaryBuild(nodeInfo);
+
+      // Call the method to get the mirror URL
+      const distributionMirrorUrl = canaryBuild.getDistributionMirrorUrl();
+
+      // Assert that core.info was called with the custom mirror URL
+      expect(infoSpy).toHaveBeenCalledWith(`Using mirror URL: ${mirrorURL}`);
+
+      // Assert that the returned URL is the custom mirror URL
+      expect(distributionMirrorUrl).toBe(mirrorURL);
+
+      // Restore the original core.info implementation
+      infoSpy.mockRestore();
+    });
+    it('should fall back to the default distribution URL if mirror URL is not provided', () => {
+      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
+
+      const nodeInfo: NodeInputs = {
+        versionSpec: '8.0.0-canary',
+        arch: 'x64',
+        checkLatest: false,
+        stable: false
+        // No mirrorURL provided here
+      };
+
+      const canaryBuild = new CanaryBuild(nodeInfo);
+
+      // Call the method to get the distribution URL
+      const distributionMirrorUrl = canaryBuild.getDistributionMirrorUrl();
+
+      // Assert that core.info was called with the default URL
+      expect(infoSpy).toHaveBeenCalledWith(
+        'Using mirror URL: https://nodejs.org/download/v8-canary'
+      );
+
+      // Assert that the returned URL is the default one
+      expect(distributionMirrorUrl).toBe(
+        'https://nodejs.org/download/v8-canary'
+      );
+
+      infoSpy.mockRestore();
+    });
+
+    it('should log the correct info when mirror URL is not provided', () => {
+      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
+
+      const nodeInfo: NodeInputs = {
+        versionSpec: '8.0.0-canary',
+        arch: 'x64',
+        checkLatest: false,
+        stable: false
+        // No mirrorURL provided here
+      };
+
+      const canaryBuild = new CanaryBuild(nodeInfo);
+
+      // Call the method
+      canaryBuild.getDistributionMirrorUrl();
+
+      // Assert that core.info was called with the fallback URL
+      expect(infoSpy).toHaveBeenCalledWith(
+        'Using mirror URL: https://nodejs.org/download/v8-canary'
+      );
+
+      infoSpy.mockRestore();
+    });
+
+    it('should return mirror URL if provided in nodeInfo', () => {
+      // Custom mirror URL to be tested
+      const mirrorURL = 'https://custom.mirror.url/v8-canary';
+
+      // Create a spy on core.info to track its calls
+      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {}); // Mocking core.info
+
+      // Prepare the nodeInfo object with the custom mirror URL
+      const nodeInfo: NodeInputs = {
+        versionSpec: '8.0.0-canary',
+        arch: 'x64',
+        mirrorURL: mirrorURL, // Custom mirrorURL provided
+        checkLatest: false,
+        stable: false
+      };
+
+      // Create an instance of CanaryBuild, passing nodeInfo to the constructor
+      const canaryBuild = new CanaryBuild(nodeInfo);
+
+      // Call the method
+      const distributionMirrorUrl = canaryBuild.getDistributionMirrorUrl();
+
+      // Assert that core.info was called with the expected message
+      expect(infoSpy).toHaveBeenCalledWith(`Using mirror URL: ${mirrorURL}`);
+
+      // Assert that the returned mirror URL is correct
+      expect(distributionMirrorUrl).toBe(mirrorURL);
+
+      // Restore the original core.info function after the test
+      infoSpy.mockRestore();
+    });
+    it('should throw an error if mirror URL is empty string', async () => {
+      const nodeInfo: NodeInputs = {
+        versionSpec: '8.0.0-canary',
+        arch: 'x64',
+        checkLatest: false,
+        stable: false,
+        mirrorURL: '' // Empty string provided as mirror URL
+      };
+
+      const canaryBuild = new CanaryBuild(nodeInfo);
+
+      // Expect the method to throw an error for empty string mirror URL
+      expect(canaryBuild.getDistributionMirrorUrl()).toThrow(
+        'Mirror URL is empty. Please provide a valid mirror URL.'
+      );
+    });
+  });
 });
diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index 501741a6b..7487cf7a5 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -1,4 +1,5 @@
 import * as core from '@actions/core';
+import 'jest';
 import * as exec from '@actions/exec';
 import * as tc from '@actions/tool-cache';
 import * as cache from '@actions/cache';
@@ -14,6 +15,11 @@ import * as main from '../src/main';
 import * as util from '../src/util';
 import OfficialBuilds from '../src/distributions/official_builds/official_builds';
 
+import * as installerFactory from '../src/distributions/installer-factory';
+jest.mock('../src/distributions/installer-factory', () => ({
+  getNodejsDistribution: jest.fn()
+}));
+
 describe('main tests', () => {
   let inputs = {} as any;
   let os = {} as any;
@@ -280,4 +286,93 @@ describe('main tests', () => {
       );
     });
   });
+
+  // Create a mock object that satisfies the BaseDistribution interface
+  const createMockNodejsDistribution = () => ({
+    setupNodeJs: jest.fn(),
+    httpClient: {}, // Mocking the httpClient (you can replace this with more detailed mocks if needed)
+    osPlat: 'darwin', // Mocking osPlat (the platform the action will run on, e.g., 'darwin', 'win32', 'linux')
+    nodeInfo: {
+      version: '14.x',
+      arch: 'x64',
+      platform: 'darwin'
+    },
+    getDistributionUrl: jest.fn().mockReturnValue('https://nodejs.org/dist/'), // Example URL
+    install: jest.fn(),
+    validate: jest.fn()
+    // Add any other methods/properties required by your BaseDistribution type
+  });
+
+  describe('Mirror URL Tests', () => {
+    beforeEach(() => {
+      jest.clearAllMocks();
+    });
+
+    it('should pass mirror URL correctly when provided', async () => {
+      jest.spyOn(core, 'getInput').mockImplementation((name: string) => {
+        if (name === 'mirror-url') return 'https://custom-mirror-url.com';
+        if (name === 'node-version') return '14.x';
+        return '';
+      });
+
+      const mockNodejsDistribution = createMockNodejsDistribution();
+      (installerFactory.getNodejsDistribution as jest.Mock).mockReturnValue(
+        mockNodejsDistribution
+      );
+
+      await main.run();
+
+      // Ensure setupNodeJs is called with the correct parameters, including the mirror URL
+      expect(mockNodejsDistribution.setupNodeJs).toHaveBeenCalledWith({
+        versionSpec: '14.x',
+        checkLatest: false,
+        auth: undefined,
+        stable: true,
+        arch: 'x64',
+        mirrorURL: 'https://custom-mirror-url.com' // Ensure this matches
+      });
+    });
+
+    it('should use default mirror URL when no mirror URL is provided', async () => {
+      jest.spyOn(core, 'getInput').mockImplementation((name: string) => {
+        if (name === 'mirror-url') return ''; // Simulating no mirror URL provided
+        if (name === 'node-version') return '14.x';
+        return '';
+      });
+
+      const mockNodejsDistribution = createMockNodejsDistribution();
+      (installerFactory.getNodejsDistribution as jest.Mock).mockReturnValue(
+        mockNodejsDistribution
+      );
+
+      await main.run();
+
+      // Expect that setupNodeJs is called with an empty mirror URL (default behavior)
+      expect(mockNodejsDistribution.setupNodeJs).toHaveBeenCalledWith(
+        expect.objectContaining({
+          mirrorURL: '' // Default URL is expected to be handled internally
+        })
+      );
+    });
+
+    it('should handle mirror URL with spaces correctly', async () => {
+      const mirrorURL = 'https://custom-mirror-url.com ';
+      const expectedTrimmedURL = 'https://custom-mirror-url.com';
+
+      // Mock the setupNodeJs function
+      const mockNodejsDistribution = {
+        setupNodeJs: jest.fn()
+      };
+
+      // Simulate calling the main function that will trigger setupNodeJs
+      await main.run();
+
+      // Assert that setupNodeJs was called with the correct trimmed mirrorURL
+      expect(mockNodejsDistribution.setupNodeJs).toHaveBeenCalledWith(
+        expect.objectContaining({
+          mirrorURL: expectedTrimmedURL // Ensure the URL is trimmed properly
+        })
+      );
+    });
+  });
 });
diff --git a/__tests__/nightly-installer.test.ts b/__tests__/nightly-installer.test.ts
index 87c437957..c794e8df0 100644
--- a/__tests__/nightly-installer.test.ts
+++ b/__tests__/nightly-installer.test.ts
@@ -10,8 +10,8 @@ import osm from 'os';
 import path from 'path';
 import * as main from '../src/main';
 import * as auth from '../src/authutil';
-import {INodeVersion} from '../src/distributions/base-models';
-
+import {INodeVersion, NodeInputs} from '../src/distributions/base-models';
+import NightlyNodejs from '../src/distributions/nightly/nightly_builds';
 import nodeTestManifest from './data/versions-manifest.json';
 import nodeTestDist from './data/node-dist-index.json';
 import nodeTestDistNightly from './data/node-nightly-index.json';
@@ -606,3 +606,139 @@ describe('setup-node', () => {
     );
   });
 });
+// Mock core.info to track the log output
+jest.mock('@actions/core', () => ({
+  info: jest.fn()
+}));
+
+// Create a subclass to access the protected method for testing purposes
+class TestNightlyNodejs extends NightlyNodejs {
+  nodeInputs: NodeInputs;
+
+  constructor(nodeInputs: NodeInputs) {
+    super(nodeInputs);
+    this.nodeInputs = nodeInputs;
+  }
+
+  getDistributionUrlPublic() {
+    // If a mirrorURL is provided, return it; otherwise, return the default URL
+    if (this.nodeInputs.mirrorURL && this.nodeInputs.mirrorURL.trim() !== '') {
+      core.info(`Using mirror URL: ${this.nodeInputs.mirrorURL}`);
+      return this.nodeInputs.mirrorURL;
+    } else {
+      core.info('Using default distribution URL for nightly Node.js.');
+      return 'https://nodejs.org/download/nightly';
+    }
+  }
+}
+describe('NightlyNodejs', () => {
+  it('uses mirror URL when provided', async () => {
+    const mirrorURL = 'https://my.custom.mirror/nodejs/nightly';
+    const nodeInfo: NodeInputs = {
+      mirrorURL: mirrorURL, // Use the custom mirror URL here
+      versionSpec: '18.0.0-nightly',
+      arch: 'x64',
+      checkLatest: false,
+      stable: false
+    };
+
+    const nightlyNode = new TestNightlyNodejs(nodeInfo);
+
+    const distributionUrl = nightlyNode.getDistributionUrlPublic();
+
+    // Check if the correct distribution URL is being used
+    expect(distributionUrl).toBe(mirrorURL);
+
+    // Verify if the core.info was called with the correct message
+    expect(core.info).toHaveBeenCalledWith(`Using mirror URL: ${mirrorURL}`);
+  });
+
+  it('falls back to default distribution URL when no mirror URL is provided', async () => {
+    const nodeInfo: NodeInputs = {
+      versionSpec: '18.0.0-nightly',
+      arch: 'x64',
+      checkLatest: false,
+      stable: false
+    };
+    const nightlyNode = new TestNightlyNodejs(nodeInfo);
+
+    const distributionUrl = nightlyNode.getDistributionUrlPublic();
+
+    expect(distributionUrl).toBe('https://nodejs.org/download/nightly');
+    expect(core.info).toHaveBeenCalledWith(
+      'Using default distribution URL for nightly Node.js.'
+    );
+  });
+
+  const core = require('@actions/core'); // Mock core
+  jest.spyOn(core, 'info').mockImplementation(() => {}); // Mock core.info function
+
+  it('logs mirror URL when provided', async () => {
+    const mirrorURL = 'https://custom.mirror/nodejs/nightly';
+
+    const nodeInfo = {
+      mirrorURL: mirrorURL, // Set the mirror URL correctly
+      versionSpec: '18.0.0-nightly',
+      arch: 'x64',
+      checkLatest: false,
+      stable: false
+    };
+
+    const nightlyNode = new TestNightlyNodejs(nodeInfo);
+    await nightlyNode.getDistributionUrlPublic(); // Ensure to await if the function is async
+
+    expect(core.info).toHaveBeenCalledWith(`Using mirror URL: ${mirrorURL}`);
+  });
+
+  it('logs default URL when no mirror URL is provided', async () => {
+    const nodeInfo: NodeInputs = {
+      versionSpec: '18.0.0-nightly',
+      arch: 'x64',
+      checkLatest: false,
+      stable: false
+    };
+    const nightlyNode = new TestNightlyNodejs(nodeInfo);
+
+    nightlyNode.getDistributionUrlPublic();
+
+    expect(core.info).toHaveBeenCalledWith(
+      'Using default distribution URL for nightly Node.js.'
+    );
+  });
+
+  it('falls back to default distribution URL if mirror URL is an empty string', async () => {
+    const nodeInfo: NodeInputs = {
+      mirrorURL: '',
+      versionSpec: '18.0.0-nightly',
+      arch: 'x64',
+      checkLatest: false,
+      stable: false
+    };
+    const nightlyNode = new TestNightlyNodejs(nodeInfo);
+
+    const distributionUrl = nightlyNode.getDistributionUrlPublic();
+
+    expect(distributionUrl).toBe('https://nodejs.org/download/nightly');
+    expect(core.info).toHaveBeenCalledWith(
+      'Using default distribution URL for nightly Node.js.'
+    );
+  });
+
+  it('falls back to default distribution URL if mirror URL is undefined', async () => {
+    const nodeInfo: NodeInputs = {
+      mirrorURL: '',
+      versionSpec: '18.0.0-nightly',
+      arch: 'x64',
+      checkLatest: false,
+      stable: false
+    };
+    const nightlyNode = new TestNightlyNodejs(nodeInfo);
+
+    const distributionUrl = nightlyNode.getDistributionUrlPublic();
+
+    expect(distributionUrl).toBe('https://nodejs.org/download/nightly');
+    expect(core.info).toHaveBeenCalledWith(
+      'Using default distribution URL for nightly Node.js.'
+    );
+  });
+});
diff --git a/__tests__/official-installer.test.ts b/__tests__/official-installer.test.ts
index 2d8f17cfa..c7d90ddac 100644
--- a/__tests__/official-installer.test.ts
+++ b/__tests__/official-installer.test.ts
@@ -11,7 +11,7 @@ import path from 'path';
 import * as main from '../src/main';
 import * as auth from '../src/authutil';
 import OfficialBuilds from '../src/distributions/official_builds/official_builds';
-import {INodeVersion} from '../src/distributions/base-models';
+import {INodeVersion, NodeInputs} from '../src/distributions/base-models';
 
 import nodeTestManifest from './data/versions-manifest.json';
 import nodeTestDist from './data/node-dist-index.json';
@@ -828,4 +828,144 @@ describe('setup-node', () => {
       }
     );
   });
+
+  import {OfficialBuilds} from './path-to-your-official-builds-file'; // Adjust path
+  import * as core from '@actions/core';
+  import * as tc from '@actions/tool-cache';
+
+  jest.mock('@actions/core');
+  jest.mock('@actions/tool-cache');
+
+  describe('OfficialBuilds - Mirror URL functionality', () => {
+    let officialBuilds: OfficialBuilds;
+
+    beforeEach(() => {
+      const mockNodeInfo = {
+        versionSpec: '16.x',
+        mirrorURL: 'https://my.custom.mirror/nodejs',
+        arch: 'x64',
+        stable: true,
+        checkLatest: false,
+        osPlat: 'linux', // Mock OS platform to avoid "undefined" error
+        auth: 'someAuthToken'
+      };
+      officialBuilds = new OfficialBuilds(mockNodeInfo);
+    });
+
+    it('should download using the mirror URL when provided', async () => {
+      const mockDownloadPath = '/some/temp/path';
+      const mockDownloadTool = jest
+        .spyOn(tc, 'downloadTool')
+        .mockResolvedValue(mockDownloadPath);
+      const mockAddPath = jest
+        .spyOn(core, 'addPath')
+        .mockImplementation(() => {});
+
+      await officialBuilds.setupNodeJs();
+
+      // Check if the mirror URL was used
+      expect(core.info).toHaveBeenCalledWith(
+        'Attempting to download using mirror URL...'
+      );
+      expect(core.info).toHaveBeenCalledWith(
+        'downloadPath from downloadFromMirrorURL() /some/temp/path'
+      );
+      expect(core.addPath).toHaveBeenCalledWith(mockDownloadPath);
+    });
+
+    it('should log a message when mirror URL is used', async () => {
+      const mockInfo = jest.spyOn(core, 'info').mockImplementation(() => {});
+
+      await officialBuilds.setupNodeJs();
+
+      // Check if the appropriate message is logged for mirror URL
+      expect(core.info).toHaveBeenCalledWith(
+        `Using mirror URL: https://my.custom.mirror/nodejs`
+      );
+    });
+
+    it('should fall back to default URL if mirror URL is not provided', async () => {
+      // Mock a scenario where mirror URL is not provided
+      officialBuilds.nodeInfo.mirrorURL = undefined;
+
+      const mockInfo = jest.spyOn(core, 'info').mockImplementation(() => {});
+
+      await officialBuilds.setupNodeJs();
+
+      // Check if fallback logic was triggered
+      expect(core.info).toHaveBeenCalledWith(
+        'Falling back to download directly from Node'
+      );
+    });
+
+    it('should log an error and handle failure during mirror URL download', async () => {
+      const errorMessage = 'Network error';
+      const mockError = jest.spyOn(core, 'error').mockImplementation(() => {});
+      const mockDebug = jest.spyOn(core, 'debug').mockImplementation(() => {});
+
+      const mockDownloadTool = jest
+        .spyOn(tc, 'downloadTool')
+        .mockRejectedValue(new Error(errorMessage));
+
+      try {
+        await officialBuilds.setupNodeJs();
+      } catch (error) {
+        // Expect core.error to be called with the error message
+        expect(core.error).toHaveBeenCalledWith(errorMessage);
+        expect(core.debug).toHaveBeenCalledWith(
+          expect.stringContaining('empty stack')
+        );
+      }
+    });
+
+    it('should log a fallback message if downloading from the mirror URL fails', async () => {
+      const mockInfo = jest.spyOn(core, 'info').mockImplementation(() => {});
+      const mockDownloadTool = jest
+        .spyOn(tc, 'downloadTool')
+        .mockRejectedValue(new Error('Download failed'));
+
+      await officialBuilds.setupNodeJs();
+
+      // Check if fallback log message was triggered
+      expect(core.info).toHaveBeenCalledWith(
+        'Failed to download from mirror URL. Falling back to default Node.js URL...'
+      );
+    });
+
+    it('should throw an error if mirror URL is not provided and downloading from both mirror and default fails', async () => {
+      const errorMessage = `Unable to find Node version for platform linux and architecture x64.`;
+
+      const mockDownloadTool = jest
+        .spyOn(tc, 'downloadTool')
+        .mockRejectedValue(new Error('Download failed'));
+      const mockGetNodeJsVersions = jest
+        .spyOn(officialBuilds, 'getNodeJsVersions')
+        .mockResolvedValue([]);
+
+      // Simulating failure in getting versions and download
+      try {
+        await officialBuilds.setupNodeJs();
+      } catch (error) {
+        expect(error.message).toContain(errorMessage);
+      }
+    });
+
+    it('should throw an error if mirror URL is undefined and not provided', async () => {
+      const errorMessage = `Unable to find Node version for platform linux and architecture x64.`;
+      officialBuilds.nodeInfo.mirrorURL = undefined; // Simulate missing mirror URL
+
+      const mockGetNodeJsVersions = jest
+        .spyOn(officialBuilds, 'getNodeJsVersions')
+        .mockResolvedValue([]);
+      const mockDownloadTool = jest
+        .spyOn(tc, 'downloadTool')
+        .mockRejectedValue(new Error('Download failed'));
+
+      try {
+        await officialBuilds.setupNodeJs();
+      } catch (error) {
+        expect(error.message).toContain(errorMessage);
+      }
+    });
+  });
 });
diff --git a/__tests__/rc-installer.test.ts b/__tests__/rc-installer.test.ts
index 736260a4d..2f72b96d0 100644
--- a/__tests__/rc-installer.test.ts
+++ b/__tests__/rc-installer.test.ts
@@ -10,12 +10,13 @@ import osm from 'os';
 import path from 'path';
 import * as main from '../src/main';
 import * as auth from '../src/authutil';
-import {INodeVersion} from '../src/distributions/base-models';
+import {INodeVersion, NodeInputs} from '../src/distributions/base-models';
 
 import nodeTestDist from './data/node-dist-index.json';
 import nodeTestDistNightly from './data/node-nightly-index.json';
 import nodeTestDistRc from './data/node-rc-index.json';
 import nodeV8CanaryTestDist from './data/v8-canary-dist-index.json';
+import RcBuild from '../src/distributions/rc/rc_builds';
 
 describe('setup-node', () => {
   let inputs = {} as any;
@@ -144,6 +145,10 @@ describe('setup-node', () => {
 
     const toolPath = path.normalize('/cache/node/12.0.0-rc.1/x64');
     findSpy.mockImplementation(() => toolPath);
+    // Ensure spies are set up before running the main logic
+    const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
+    const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
+
     await main.run();
 
     expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
@@ -156,6 +161,10 @@ describe('setup-node', () => {
 
     const toolPath = path.normalize('/cache/node/12.0.0-rc.1/x64');
     findSpy.mockImplementation(() => toolPath);
+
+    // Ensure spies are set up before running the main logic
+    const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
+
     await main.run();
 
     expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
@@ -168,6 +177,10 @@ describe('setup-node', () => {
 
     const toolPath = path.normalize('/cache/node/12.0.0-rc.1/x64');
     findSpy.mockImplementation(() => toolPath);
+    // Ensure spies are set up before running the main logic
+    const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
+    const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
+
     await main.run();
 
     const expPath = path.join(toolPath, 'bin');
@@ -224,6 +237,10 @@ describe('setup-node', () => {
     inputs['node-version'] = versionSpec;
 
     findSpy.mockImplementation(() => '');
+    // Ensure spies are set up before running the main logic
+    const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
+    const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
+
     await main.run();
 
     expect(cnSpy).toHaveBeenCalledWith(
@@ -247,6 +264,11 @@ describe('setup-node', () => {
     dlSpy.mockImplementation(() => {
       throw new Error(errMsg);
     });
+
+    // Ensure spies are set up before running the main logic
+    const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
+    const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
+
     await main.run();
 
     expect(cnSpy).toHaveBeenCalledWith(`::error::${errMsg}${osm.EOL}`);
@@ -281,6 +303,9 @@ describe('setup-node', () => {
       const toolPath = path.normalize(`/cache/node/${version}/${arch}`);
       exSpy.mockImplementation(async () => '/some/other/temp/path');
       cacheSpy.mockImplementation(async () => toolPath);
+      // Ensure spies are set up before running the main logic
+      const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
+      const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
 
       await main.run();
       expect(dlSpy).toHaveBeenCalled();
@@ -331,6 +356,11 @@ describe('setup-node', () => {
         inputs['node-version'] = input;
         os['arch'] = 'x64';
         os['platform'] = 'linux';
+
+        // Ensure spies are set up before running the main logic
+        const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
+        const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
+
         // act
         await main.run();
 
@@ -352,14 +382,18 @@ describe('setup-node', () => {
       'finds the %s version in the hostedToolcache',
       async (input, expectedVersion) => {
         const toolPath = path.normalize(`/cache/node/${expectedVersion}/x64`);
-        findSpy.mockImplementation((_, version) =>
-          path.normalize(`/cache/node/${version}/x64`)
-        );
+
+        // Mocking the behavior of findSpy and findAllVersionsSpy
+        findSpy.mockImplementation((_, version) => {
+          console.log(`findSpy called for version: ${version}`); // Debugging line
+          return path.normalize(`/cache/node/${version}/x64`);
+        });
+
         findAllVersionsSpy.mockReturnValue([
           '2.2.2-rc.2',
           '1.1.1-rc.1',
           '99.1.1',
-          expectedVersion,
+          expectedVersion, // This should be the expected version
           '88.1.1',
           '3.3.3-rc.3'
         ]);
@@ -368,14 +402,27 @@ describe('setup-node', () => {
         os['arch'] = 'x64';
         os['platform'] = 'linux';
 
-        // act
+        // Ensure spies are set up before running the main logic
+        const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
+        const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
+
+        // Act: Run the main function (your application logic)
         await main.run();
 
-        // assert
+        // Debugging output to check if logSpy was called
+        console.log('logSpy calls:', logSpy.mock.calls); // Debugging line
+
+        // Assert: Check that the logSpy was called with the correct message
         expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
+
+        // Assert: Check that cnSpy was called with the correct add-path action
         expect(cnSpy).toHaveBeenCalledWith(
           `::add-path::${path.join(toolPath, 'bin')}${osm.EOL}`
         );
+
+        // Clean up spies
+        logSpy.mockRestore();
+        cnSpy.mockRestore();
       }
     );
 
@@ -390,6 +437,10 @@ describe('setup-node', () => {
       inputs['node-version'] = versionSpec;
       os['arch'] = 'x64';
       os['platform'] = 'linux';
+      // Ensure spies are set up before running the main logic
+      const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
+      const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
+
       // act
       await main.run();
 
@@ -399,4 +450,124 @@ describe('setup-node', () => {
       );
     });
   });
+
+  describe('RcBuild - Mirror URL functionality', () => {
+    const nodeInfo: NodeInputs = {
+      versionSpec: '18.0.0-rc',
+      arch: 'x64',
+      mirrorURL: '',
+      checkLatest: false,
+      stable: false
+    };
+
+    class RcBuild {
+      mirrorURL: string | undefined;
+      nodeInfo: NodeInputs;
+
+      constructor(nodeInfo: NodeInputs) {
+        this.nodeInfo = nodeInfo; // Store the nodeInfo object passed into the constructor
+        this.mirrorURL = nodeInfo.mirrorURL; // Set mirrorURL from nodeInfo, or undefined if not provided
+      }
+
+      getDistributionMirrorUrl() {
+        // If mirrorURL is provided in nodeInfo, return it
+        if (this.nodeInfo.mirrorURL != '') {
+          core.info(`Using mirror URL: ${this.nodeInfo.mirrorURL}`);
+          return this.nodeInfo.mirrorURL;
+        } else {
+          if (this.nodeInfo.mirrorURL === '') {
+            throw new Error(
+              'Mirror URL is empty. Please provide a valid mirror URL.'
+            );
+          } else {
+            if (this.nodeInfo.mirrorURL === undefined) {
+              throw new Error(
+                'Mirror URL is undefined. Please provide a valid mirror URL.'
+              );
+            }
+          }
+        }
+      }
+    }
+
+    it('should return the default distribution URL if no mirror URL is provided', () => {
+      // Assuming nodeInfo does not have a mirrorURL
+      const nodeInfo = {
+        versionSpec: '16.0.0-rc',
+        arch: 'x64',
+        checkLatest: false,
+        stable: false,
+        mirrorURL: '' // No mirror URL provided
+      };
+
+      const rcBuild = new RcBuild(nodeInfo);
+
+      const distributionUrl = rcBuild.getDistributionMirrorUrl();
+
+      // Default URL
+      expect(distributionUrl).toBe('https://nodejs.org/download/rc');
+    });
+
+    it('should use the mirror URL from nodeInfo if provided', () => {
+      const mirrorURL = 'https://my.custom.mirror/nodejs'; // Set the custom mirror URL
+      nodeInfo.mirrorURL = mirrorURL; // Set the mirrorURL in nodeInfo
+
+      const rcBuild = new RcBuild(nodeInfo);
+
+      // Mock core.info to track its calls
+      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
+
+      // Call the method
+      const distributionMirrorUrl = rcBuild.getDistributionMirrorUrl(); // Access the method
+
+      // Assert that core.info was called with the correct mirror URL message
+      expect(infoSpy).toHaveBeenCalledWith(`Using mirror URL: ${mirrorURL}`);
+
+      // Assert that the returned URL is the mirror URL
+      expect(distributionMirrorUrl).toBe(mirrorURL);
+
+      // Restore the original core.info function after the test
+      infoSpy.mockRestore();
+    });
+
+    it('should throw an error if mirror URL is empty', () => {
+      nodeInfo.mirrorURL = ''; // Empty mirror URL
+
+      const rcBuild = new RcBuild(nodeInfo);
+
+      // Mock core.info to track its calls
+      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
+
+      // Expect the function to return the default URL because the mirror URL is empty
+      const distributionMirrorUrl = rcBuild.getDistributionMirrorUrl();
+
+      // Assert the returned URL is the default URL
+      expect(distributionMirrorUrl).toBe('https://nodejs.org/download/rc');
+
+      // Ensure that core.info was NOT called because it's not a custom mirror URL
+      expect(infoSpy).not.toHaveBeenCalled();
+
+      // Restore the original core.info function after the test
+      infoSpy.mockRestore();
+    });
+
+    it('should throw an error if mirror URL is undefined', () => {
+      nodeInfo.mirrorURL = undefined; // Undefined mirror URL
+
+      const rcBuild = new RcBuild(nodeInfo);
+
+      // Mock core.info to track its calls
+      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
+
+      // Expect the function to throw an error due to undefined mirror URL
+      expect(() => rcBuild.getDistributionMirrorUrl()).toThrowError(
+        'Mirror URL is undefined. Please provide a valid mirror URL.'
+      );
+
+      // Ensure that core.info was NOT called because it's not a valid URL
+      expect(infoSpy).not.toHaveBeenCalled();
+
+      infoSpy.mockRestore();
+    });
+  });
 });
diff --git a/dist/setup/index.js b/dist/setup/index.js
index cdca1dbfd..943b90070 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100154,6 +100154,32 @@ class BaseDistribution {
             return response.result || [];
         });
     }
+    getMirrorUrlVersions() {
+        return __awaiter(this, void 0, void 0, function* () {
+            const initialUrl = this.getDistributionUrl();
+            const dataUrl = `${initialUrl}/index.json`;
+            try {
+                const response = yield this.httpClient.getJson(dataUrl);
+                return response.result || [];
+            }
+            catch (err) {
+                if (err instanceof Error &&
+                    err.message.includes('getaddrinfo EAI_AGAIN')) {
+                    core.error(`Network error: Failed to resolve the server at ${dataUrl}. 
+                      Please check your DNS settings or verify that the URL is correct.`);
+                }
+                else if (err instanceof hc.HttpClientError && err.statusCode === 404) {
+                    core.error(`404 Error: Unable to find versions at ${dataUrl}. 
+                      Please verify that the mirror URL is valid.`);
+                }
+                else {
+                    core.error(`Failed to fetch Node.js versions from ${dataUrl}. 
+                      Please check the URL and try again.}`);
+                }
+                throw err;
+            }
+        });
+    }
     getNodejsDistInfo(version) {
         const osArch = this.translateArchToDistUrl(this.nodeInfo.arch);
         version = semver_1.default.clean(version) || '';
@@ -100174,6 +100200,26 @@ class BaseDistribution {
             fileName: fileName
         };
     }
+    getNodejsMirrorURLInfo(version) {
+        const mirrorURL = this.nodeInfo.mirrorURL;
+        const osArch = this.translateArchToDistUrl(this.nodeInfo.arch);
+        version = semver_1.default.clean(version) || '';
+        const fileName = this.osPlat == 'win32'
+            ? `node-v${version}-win-${osArch}`
+            : `node-v${version}-${this.osPlat}-${osArch}`;
+        const urlFileName = this.osPlat == 'win32'
+            ? this.nodeInfo.arch === 'arm64'
+                ? `${fileName}.zip`
+                : `${fileName}.7z`
+            : `${fileName}.tar.gz`;
+        const url = `${mirrorURL}/v${version}/${urlFileName}`;
+        return {
+            downloadUrl: url,
+            resolvedVersion: version,
+            arch: osArch,
+            fileName: fileName
+        };
+    }
     downloadNodejs(info) {
         return __awaiter(this, void 0, void 0, function* () {
             let downloadPath = '';
@@ -100185,8 +100231,15 @@ class BaseDistribution {
                 if (err instanceof tc.HTTPError &&
                     err.httpStatusCode == 404 &&
                     this.osPlat == 'win32') {
-                    return yield this.acquireWindowsNodeFromFallbackLocation(info.resolvedVersion, info.arch);
+                    return yield this.acquireWindowsNodeFromFallbackLocation(info.resolvedVersion, info.arch, info.downloadUrl);
                 }
+                // Handle network-related issues (e.g., DNS resolution failures)
+                if (err instanceof Error &&
+                    err.message.includes('getaddrinfo EAI_AGAIN')) {
+                    core.error(`Network error: Failed to resolve the server at ${info.downloadUrl}. 
+            This could be due to a DNS resolution issue. Please verify the URL or check your network connection.`);
+                }
+                core.error(`Download failed from ${info.downloadUrl}. Please check the URl and try again.`);
                 throw err;
             }
             const toolPath = yield this.extractArchive(downloadPath, info, true);
@@ -100202,8 +100255,9 @@ class BaseDistribution {
         return { range: valid, options };
     }
     acquireWindowsNodeFromFallbackLocation(version_1) {
-        return __awaiter(this, arguments, void 0, function* (version, arch = os_1.default.arch()) {
+        return __awaiter(this, arguments, void 0, function* (version, arch = os_1.default.arch(), downloadUrl) {
             const initialUrl = this.getDistributionUrl();
+            core.info('url: ' + initialUrl);
             const osArch = this.translateArchToDistUrl(arch);
             // Create temporary folder to download to
             const tempDownloadFolder = `temp_${(0, uuid_1.v4)()}`;
@@ -100217,6 +100271,9 @@ class BaseDistribution {
                 exeUrl = `${initialUrl}/v${version}/win-${osArch}/node.exe`;
                 libUrl = `${initialUrl}/v${version}/win-${osArch}/node.lib`;
                 core.info(`Downloading only node binary from ${exeUrl}`);
+                if (downloadUrl != exeUrl) {
+                    core.error('unable to download node binary with the provided URL. Please check and try again');
+                }
                 const exePath = yield tc.downloadTool(exeUrl);
                 yield io.cp(exePath, path.join(tempDir, 'node.exe'));
                 const libPath = yield tc.downloadTool(libUrl);
@@ -100392,7 +100449,22 @@ class NightlyNodejs extends base_distribution_prerelease_1.default {
         this.distribution = 'nightly';
     }
     getDistributionUrl() {
-        return 'https://nodejs.org/download/nightly';
+        if (this.nodeInfo.mirrorURL) {
+            if (this.nodeInfo.mirrorURL != '') {
+                return this.nodeInfo.mirrorURL;
+            }
+            else {
+                if (this.nodeInfo.mirrorURL === '') {
+                    throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
+                }
+                else {
+                    throw new Error('Mirror URL is not a valid');
+                }
+            }
+        }
+        else {
+            return 'https://nodejs.org/download/nightly';
+        }
     }
 }
 exports["default"] = NightlyNodejs;
@@ -100451,73 +100523,94 @@ class OfficialBuilds extends base_distribution_1.default {
     }
     setupNodeJs() {
         return __awaiter(this, void 0, void 0, function* () {
-            var _a;
-            let manifest;
-            let nodeJsVersions;
-            const osArch = this.translateArchToDistUrl(this.nodeInfo.arch);
-            if (this.isLtsAlias(this.nodeInfo.versionSpec)) {
-                core.info('Attempt to resolve LTS alias from manifest...');
-                // No try-catch since it's not possible to resolve LTS alias without manifest
-                manifest = yield this.getManifest();
-                this.nodeInfo.versionSpec = this.resolveLtsAliasFromManifest(this.nodeInfo.versionSpec, this.nodeInfo.stable, manifest);
-            }
-            if (this.isLatestSyntax(this.nodeInfo.versionSpec)) {
-                nodeJsVersions = yield this.getNodeJsVersions();
-                const versions = this.filterVersions(nodeJsVersions);
-                this.nodeInfo.versionSpec = this.evaluateVersions(versions);
-                core.info('getting latest node version...');
-            }
-            if (this.nodeInfo.checkLatest) {
-                core.info('Attempt to resolve the latest version from manifest...');
-                const resolvedVersion = yield this.resolveVersionFromManifest(this.nodeInfo.versionSpec, this.nodeInfo.stable, osArch, manifest);
-                if (resolvedVersion) {
-                    this.nodeInfo.versionSpec = resolvedVersion;
-                    core.info(`Resolved as '${resolvedVersion}'`);
+            var _a, _b;
+            if (this.nodeInfo.mirrorURL) {
+                if (this.nodeInfo.mirrorURL === '') {
+                    throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
                 }
-                else {
-                    core.info(`Failed to resolve version ${this.nodeInfo.versionSpec} from manifest`);
-                }
-            }
-            let toolPath = this.findVersionInHostedToolCacheDirectory();
-            if (toolPath) {
-                core.info(`Found in cache @ ${toolPath}`);
-                this.addToolPath(toolPath);
-                return;
-            }
-            let downloadPath = '';
-            try {
-                core.info(`Attempting to download ${this.nodeInfo.versionSpec}...`);
-                const versionInfo = yield this.getInfoFromManifest(this.nodeInfo.versionSpec, this.nodeInfo.stable, osArch, manifest);
-                if (versionInfo) {
-                    core.info(`Acquiring ${versionInfo.resolvedVersion} - ${versionInfo.arch} from ${versionInfo.downloadUrl}`);
-                    downloadPath = yield tc.downloadTool(versionInfo.downloadUrl, undefined, this.nodeInfo.auth);
+                let downloadPath = '';
+                let toolPath = '';
+                try {
+                    core.info(`Attempting to download using mirror URL...`);
+                    downloadPath = yield this.downloadFromMirrorURL(); // Attempt to download from the mirror
+                    core.info('downloadPath from downloadFromMirrorURL() ' + downloadPath);
                     if (downloadPath) {
-                        toolPath = yield this.extractArchive(downloadPath, versionInfo, false);
+                        toolPath = downloadPath;
                     }
                 }
-                else {
-                    core.info('Not found in manifest. Falling back to download directly from Node');
+                catch (err) {
+                    core.info(err.message);
+                    core.debug((_a = err.stack) !== null && _a !== void 0 ? _a : 'empty stack');
                 }
             }
-            catch (err) {
-                // Rate limit?
-                if (err instanceof tc.HTTPError &&
-                    (err.httpStatusCode === 403 || err.httpStatusCode === 429)) {
-                    core.info(`Received HTTP status code ${err.httpStatusCode}. This usually indicates the rate limit has been exceeded`);
+            else {
+                let manifest;
+                let nodeJsVersions;
+                const osArch = this.translateArchToDistUrl(this.nodeInfo.arch);
+                if (this.isLtsAlias(this.nodeInfo.versionSpec)) {
+                    core.info('Attempt to resolve LTS alias from manifest...');
+                    // No try-catch since it's not possible to resolve LTS alias without manifest
+                    manifest = yield this.getManifest();
+                    this.nodeInfo.versionSpec = this.resolveLtsAliasFromManifest(this.nodeInfo.versionSpec, this.nodeInfo.stable, manifest);
+                }
+                if (this.isLatestSyntax(this.nodeInfo.versionSpec)) {
+                    nodeJsVersions = yield this.getNodeJsVersions();
+                    const versions = this.filterVersions(nodeJsVersions);
+                    this.nodeInfo.versionSpec = this.evaluateVersions(versions);
+                    core.info('getting latest node version...');
+                }
+                if (this.nodeInfo.checkLatest) {
+                    core.info('Attempt to resolve the latest version from manifest...');
+                    const resolvedVersion = yield this.resolveVersionFromManifest(this.nodeInfo.versionSpec, this.nodeInfo.stable, osArch, manifest);
+                    if (resolvedVersion) {
+                        this.nodeInfo.versionSpec = resolvedVersion;
+                        core.info(`Resolved as '${resolvedVersion}'`);
+                    }
+                    else {
+                        core.info(`Failed to resolve version ${this.nodeInfo.versionSpec} from manifest`);
+                    }
                 }
-                else {
-                    core.info(err.message);
+                let toolPath = this.findVersionInHostedToolCacheDirectory();
+                if (toolPath) {
+                    core.info(`Found in cache @ ${toolPath}`);
+                    this.addToolPath(toolPath);
+                    return;
                 }
-                core.debug((_a = err.stack) !== null && _a !== void 0 ? _a : 'empty stack');
-                core.info('Falling back to download directly from Node');
-            }
-            if (!toolPath) {
-                toolPath = yield this.downloadDirectlyFromNode();
-            }
-            if (this.osPlat != 'win32') {
-                toolPath = path_1.default.join(toolPath, 'bin');
+                let downloadPath = '';
+                try {
+                    core.info(`Attempting to download ${this.nodeInfo.versionSpec}...`);
+                    const versionInfo = yield this.getInfoFromManifest(this.nodeInfo.versionSpec, this.nodeInfo.stable, osArch, manifest);
+                    if (versionInfo) {
+                        core.info(`Acquiring ${versionInfo.resolvedVersion} - ${versionInfo.arch} from ${versionInfo.downloadUrl}`);
+                        downloadPath = yield tc.downloadTool(versionInfo.downloadUrl, undefined, this.nodeInfo.auth);
+                        if (downloadPath) {
+                            toolPath = yield this.extractArchive(downloadPath, versionInfo, false);
+                        }
+                    }
+                    else {
+                        core.info('Not found in manifest. Falling back to download directly from Node');
+                    }
+                }
+                catch (err) {
+                    // Rate limit?
+                    if (err instanceof tc.HTTPError &&
+                        (err.httpStatusCode === 403 || err.httpStatusCode === 429)) {
+                        core.info(`Received HTTP status code ${err.httpStatusCode}. This usually indicates the rate limit has been exceeded`);
+                    }
+                    else {
+                        core.info(err.message);
+                    }
+                    core.debug((_b = err.stack) !== null && _b !== void 0 ? _b : 'empty stack');
+                    core.info('Falling back to download directly from Node');
+                }
+                if (!toolPath) {
+                    toolPath = yield this.downloadDirectlyFromNode();
+                }
+                if (this.osPlat != 'win32') {
+                    toolPath = path_1.default.join(toolPath, 'bin');
+                }
+                core.addPath(toolPath);
             }
-            core.addPath(toolPath);
         });
     }
     addToolPath(toolPath) {
@@ -100559,6 +100652,9 @@ class OfficialBuilds extends base_distribution_1.default {
         return version;
     }
     getDistributionUrl() {
+        if (this.nodeInfo.mirrorURL) {
+            return this.nodeInfo.mirrorURL;
+        }
         return `https://nodejs.org/dist`;
     }
     getManifest() {
@@ -100626,6 +100722,33 @@ class OfficialBuilds extends base_distribution_1.default {
     isLatestSyntax(versionSpec) {
         return ['current', 'latest', 'node'].includes(versionSpec);
     }
+    downloadFromMirrorURL() {
+        return __awaiter(this, void 0, void 0, function* () {
+            const nodeJsVersions = yield this.getMirrorUrlVersions();
+            const versions = this.filterVersions(nodeJsVersions);
+            const evaluatedVersion = this.evaluateVersions(versions);
+            if (!evaluatedVersion) {
+                throw new Error(`Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} from the provided mirror-url ${this.nodeInfo.mirrorURL}. Please check the mirror-url`);
+            }
+            const toolName = this.getNodejsMirrorURLInfo(evaluatedVersion);
+            try {
+                const toolPath = yield this.downloadNodejs(toolName);
+                return toolPath;
+            }
+            catch (error) {
+                if (error instanceof tc.HTTPError && error.httpStatusCode === 404) {
+                    core.error(`Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
+                        'This usually happens when downloadable binaries are not fully updated at https://nodejs.org/. ' +
+                        'To resolve this issue you may either fall back to the older version or try again later.');
+                }
+                else {
+                    // For any other error type, you can log the error message.
+                    core.error(`An unexpected error occurred like url might not correct`);
+                }
+                throw error;
+            }
+        });
+    }
 }
 exports["default"] = OfficialBuilds;
 
@@ -100643,11 +100766,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 Object.defineProperty(exports, "__esModule", ({ value: true }));
 const base_distribution_1 = __importDefault(__nccwpck_require__(7));
 class RcBuild extends base_distribution_1.default {
+    getDistributionMirrorUrl() {
+        throw new Error('Method not implemented.');
+    }
     constructor(nodeInfo) {
         super(nodeInfo);
     }
     getDistributionUrl() {
-        return 'https://nodejs.org/download/rc';
+        if (this.nodeInfo.mirrorURL) {
+            if (this.nodeInfo.mirrorURL != '') {
+                return this.nodeInfo.mirrorURL;
+            }
+            else {
+                if (this.nodeInfo.mirrorURL === '') {
+                    throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
+                }
+                else {
+                    throw new Error('Mirror URL is not a valid');
+                }
+            }
+        }
+        else {
+            return 'https://nodejs.org/download/rc';
+        }
     }
 }
 exports["default"] = RcBuild;
@@ -100671,7 +100812,22 @@ class CanaryBuild extends base_distribution_prerelease_1.default {
         this.distribution = 'v8-canary';
     }
     getDistributionUrl() {
-        return 'https://nodejs.org/download/v8-canary';
+        if (this.nodeInfo.mirrorURL) {
+            if (this.nodeInfo.mirrorURL != '') {
+                return this.nodeInfo.mirrorURL;
+            }
+            else {
+                if (this.nodeInfo.mirrorURL === '') {
+                    throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
+                }
+                else {
+                    throw new Error('Mirror URL is not a valid');
+                }
+            }
+        }
+        else {
+            return 'https://nodejs.org/download/v8-canary';
+        }
     }
 }
 exports["default"] = CanaryBuild;
@@ -100748,6 +100904,7 @@ function run() {
             if (!arch) {
                 arch = os_1.default.arch();
             }
+            const mirrorURL = core.getInput('mirror-url').trim(); // .trim() to remove any accidental spaces
             if (version) {
                 const token = core.getInput('token');
                 const auth = !token ? undefined : `token ${token}`;
@@ -100758,7 +100915,8 @@ function run() {
                     checkLatest,
                     auth,
                     stable,
-                    arch
+                    arch,
+                    mirrorURL
                 };
                 const nodeDistribution = (0, installer_factory_1.getNodejsDistribution)(nodejsInfo);
                 yield nodeDistribution.setupNodeJs();
diff --git a/src/distributions/base-distribution.ts b/src/distributions/base-distribution.ts
index 70b4b5724..2235d28aa 100644
--- a/src/distributions/base-distribution.ts
+++ b/src/distributions/base-distribution.ts
@@ -104,6 +104,31 @@ export default abstract class BaseDistribution {
     return response.result || [];
   }
 
+  protected async getMirrorUrlVersions(): Promise<INodeVersion[]> {
+    const initialUrl = this.getDistributionUrl();
+
+    const dataUrl = `${initialUrl}/index.json`;
+    try {
+      const response = await this.httpClient.getJson<INodeVersion[]>(dataUrl);
+      return response.result || [];
+    } catch (err) {
+      if (
+        err instanceof Error &&
+        err.message.includes('getaddrinfo EAI_AGAIN')
+      ) {
+        core.error(`Network error: Failed to resolve the server at ${dataUrl}. 
+                      Please check your DNS settings or verify that the URL is correct.`);
+      } else if (err instanceof hc.HttpClientError && err.statusCode === 404) {
+        core.error(`404 Error: Unable to find versions at ${dataUrl}. 
+                      Please verify that the mirror URL is valid.`);
+      } else {
+        core.error(`Failed to fetch Node.js versions from ${dataUrl}. 
+                      Please check the URL and try again.}`);
+      }
+      throw err;
+    }
+  }
+
   protected getNodejsDistInfo(version: string) {
     const osArch: string = this.translateArchToDistUrl(this.nodeInfo.arch);
     version = semver.clean(version) || '';
@@ -128,6 +153,33 @@ export default abstract class BaseDistribution {
     };
   }
 
+  protected getNodejsMirrorURLInfo(version: string) {
+    const mirrorURL = this.nodeInfo.mirrorURL;
+
+    const osArch: string = this.translateArchToDistUrl(this.nodeInfo.arch);
+
+    version = semver.clean(version) || '';
+    const fileName: string =
+      this.osPlat == 'win32'
+        ? `node-v${version}-win-${osArch}`
+        : `node-v${version}-${this.osPlat}-${osArch}`;
+    const urlFileName: string =
+      this.osPlat == 'win32'
+        ? this.nodeInfo.arch === 'arm64'
+          ? `${fileName}.zip`
+          : `${fileName}.7z`
+        : `${fileName}.tar.gz`;
+
+    const url = `${mirrorURL}/v${version}/${urlFileName}`;
+
+    return <INodeVersionInfo>{
+      downloadUrl: url,
+      resolvedVersion: version,
+      arch: osArch,
+      fileName: fileName
+    };
+  }
+
   protected async downloadNodejs(info: INodeVersionInfo) {
     let downloadPath = '';
     core.info(
@@ -143,9 +195,23 @@ export default abstract class BaseDistribution {
       ) {
         return await this.acquireWindowsNodeFromFallbackLocation(
           info.resolvedVersion,
-          info.arch
+          info.arch,
+          info.downloadUrl
         );
       }
+      // Handle network-related issues (e.g., DNS resolution failures)
+      if (
+        err instanceof Error &&
+        err.message.includes('getaddrinfo EAI_AGAIN')
+      ) {
+        core.error(
+          `Network error: Failed to resolve the server at ${info.downloadUrl}. 
+            This could be due to a DNS resolution issue. Please verify the URL or check your network connection.`
+        );
+      }
+      core.error(
+        `Download failed from ${info.downloadUrl}. Please check the URl and try again.`
+      );
 
       throw err;
     }
@@ -166,9 +232,11 @@ export default abstract class BaseDistribution {
 
   protected async acquireWindowsNodeFromFallbackLocation(
     version: string,
-    arch: string = os.arch()
+    arch: string = os.arch(),
+    downloadUrl: string
   ): Promise<string> {
     const initialUrl = this.getDistributionUrl();
+    core.info('url: ' + initialUrl);
     const osArch: string = this.translateArchToDistUrl(arch);
 
     // Create temporary folder to download to
@@ -185,6 +253,12 @@ export default abstract class BaseDistribution {
 
       core.info(`Downloading only node binary from ${exeUrl}`);
 
+      if (downloadUrl != exeUrl) {
+        core.error(
+          'unable to download node binary with the provided URL. Please check and try again'
+        );
+      }
+
       const exePath = await tc.downloadTool(exeUrl);
       await io.cp(exePath, path.join(tempDir, 'node.exe'));
       const libPath = await tc.downloadTool(libUrl);
diff --git a/src/distributions/base-models.ts b/src/distributions/base-models.ts
index 0be93b635..1af61ec8d 100644
--- a/src/distributions/base-models.ts
+++ b/src/distributions/base-models.ts
@@ -4,6 +4,7 @@ export interface NodeInputs {
   auth?: string;
   checkLatest: boolean;
   stable: boolean;
+  mirrorURL?: string;
 }
 
 export interface INodeVersionInfo {
diff --git a/src/distributions/nightly/nightly_builds.ts b/src/distributions/nightly/nightly_builds.ts
index 86a89eed9..340d45795 100644
--- a/src/distributions/nightly/nightly_builds.ts
+++ b/src/distributions/nightly/nightly_builds.ts
@@ -1,13 +1,29 @@
 import BasePrereleaseNodejs from '../base-distribution-prerelease';
 import {NodeInputs} from '../base-models';
+import * as core from '@actions/core';
 
 export default class NightlyNodejs extends BasePrereleaseNodejs {
   protected distribution = 'nightly';
+
   constructor(nodeInfo: NodeInputs) {
     super(nodeInfo);
   }
 
   protected getDistributionUrl(): string {
-    return 'https://nodejs.org/download/nightly';
+    if (this.nodeInfo.mirrorURL) {
+      if (this.nodeInfo.mirrorURL != '') {
+        return this.nodeInfo.mirrorURL;
+      } else {
+        if (this.nodeInfo.mirrorURL === '') {
+          throw new Error(
+            'Mirror URL is empty. Please provide a valid mirror URL.'
+          );
+        } else {
+          throw new Error('Mirror URL is not a valid');
+        }
+      }
+    } else {
+      return 'https://nodejs.org/download/nightly';
+    }
   }
 }
diff --git a/src/distributions/official_builds/official_builds.ts b/src/distributions/official_builds/official_builds.ts
index e56eaf812..d5cd1cb51 100644
--- a/src/distributions/official_builds/official_builds.ts
+++ b/src/distributions/official_builds/official_builds.ts
@@ -15,115 +15,136 @@ export default class OfficialBuilds extends BaseDistribution {
   }
 
   public async setupNodeJs() {
-    let manifest: tc.IToolRelease[] | undefined;
-    let nodeJsVersions: INodeVersion[] | undefined;
-    const osArch = this.translateArchToDistUrl(this.nodeInfo.arch);
+    if (this.nodeInfo.mirrorURL) {
+      if (this.nodeInfo.mirrorURL === '') {
+        throw new Error(
+          'Mirror URL is empty. Please provide a valid mirror URL.'
+        );
+      }
+      let downloadPath = '';
+      let toolPath = '';
+      try {
+        core.info(`Attempting to download using mirror URL...`);
+        downloadPath = await this.downloadFromMirrorURL(); // Attempt to download from the mirror
+        core.info('downloadPath from downloadFromMirrorURL() ' + downloadPath);
+        if (downloadPath) {
+          toolPath = downloadPath;
+        }
+      } catch (err) {
+        core.info((err as Error).message);
+        core.debug((err as Error).stack ?? 'empty stack');
+      }
+    } else {
+      let manifest: tc.IToolRelease[] | undefined;
+      let nodeJsVersions: INodeVersion[] | undefined;
+      const osArch = this.translateArchToDistUrl(this.nodeInfo.arch);
 
-    if (this.isLtsAlias(this.nodeInfo.versionSpec)) {
-      core.info('Attempt to resolve LTS alias from manifest...');
+      if (this.isLtsAlias(this.nodeInfo.versionSpec)) {
+        core.info('Attempt to resolve LTS alias from manifest...');
 
-      // No try-catch since it's not possible to resolve LTS alias without manifest
-      manifest = await this.getManifest();
+        // No try-catch since it's not possible to resolve LTS alias without manifest
+        manifest = await this.getManifest();
 
-      this.nodeInfo.versionSpec = this.resolveLtsAliasFromManifest(
-        this.nodeInfo.versionSpec,
-        this.nodeInfo.stable,
-        manifest
-      );
-    }
+        this.nodeInfo.versionSpec = this.resolveLtsAliasFromManifest(
+          this.nodeInfo.versionSpec,
+          this.nodeInfo.stable,
+          manifest
+        );
+      }
 
-    if (this.isLatestSyntax(this.nodeInfo.versionSpec)) {
-      nodeJsVersions = await this.getNodeJsVersions();
-      const versions = this.filterVersions(nodeJsVersions);
-      this.nodeInfo.versionSpec = this.evaluateVersions(versions);
+      if (this.isLatestSyntax(this.nodeInfo.versionSpec)) {
+        nodeJsVersions = await this.getNodeJsVersions();
+        const versions = this.filterVersions(nodeJsVersions);
+        this.nodeInfo.versionSpec = this.evaluateVersions(versions);
 
-      core.info('getting latest node version...');
-    }
+        core.info('getting latest node version...');
+      }
 
-    if (this.nodeInfo.checkLatest) {
-      core.info('Attempt to resolve the latest version from manifest...');
-      const resolvedVersion = await this.resolveVersionFromManifest(
-        this.nodeInfo.versionSpec,
-        this.nodeInfo.stable,
-        osArch,
-        manifest
-      );
-      if (resolvedVersion) {
-        this.nodeInfo.versionSpec = resolvedVersion;
-        core.info(`Resolved as '${resolvedVersion}'`);
-      } else {
-        core.info(
-          `Failed to resolve version ${this.nodeInfo.versionSpec} from manifest`
+      if (this.nodeInfo.checkLatest) {
+        core.info('Attempt to resolve the latest version from manifest...');
+        const resolvedVersion = await this.resolveVersionFromManifest(
+          this.nodeInfo.versionSpec,
+          this.nodeInfo.stable,
+          osArch,
+          manifest
         );
+        if (resolvedVersion) {
+          this.nodeInfo.versionSpec = resolvedVersion;
+          core.info(`Resolved as '${resolvedVersion}'`);
+        } else {
+          core.info(
+            `Failed to resolve version ${this.nodeInfo.versionSpec} from manifest`
+          );
+        }
       }
-    }
 
-    let toolPath = this.findVersionInHostedToolCacheDirectory();
+      let toolPath = this.findVersionInHostedToolCacheDirectory();
 
-    if (toolPath) {
-      core.info(`Found in cache @ ${toolPath}`);
-      this.addToolPath(toolPath);
-      return;
-    }
-
-    let downloadPath = '';
-    try {
-      core.info(`Attempting to download ${this.nodeInfo.versionSpec}...`);
+      if (toolPath) {
+        core.info(`Found in cache @ ${toolPath}`);
+        this.addToolPath(toolPath);
+        return;
+      }
 
-      const versionInfo = await this.getInfoFromManifest(
-        this.nodeInfo.versionSpec,
-        this.nodeInfo.stable,
-        osArch,
-        manifest
-      );
+      let downloadPath = '';
+      try {
+        core.info(`Attempting to download ${this.nodeInfo.versionSpec}...`);
 
-      if (versionInfo) {
-        core.info(
-          `Acquiring ${versionInfo.resolvedVersion} - ${versionInfo.arch} from ${versionInfo.downloadUrl}`
-        );
-        downloadPath = await tc.downloadTool(
-          versionInfo.downloadUrl,
-          undefined,
-          this.nodeInfo.auth
+        const versionInfo = await this.getInfoFromManifest(
+          this.nodeInfo.versionSpec,
+          this.nodeInfo.stable,
+          osArch,
+          manifest
         );
 
-        if (downloadPath) {
-          toolPath = await this.extractArchive(
-            downloadPath,
-            versionInfo,
-            false
+        if (versionInfo) {
+          core.info(
+            `Acquiring ${versionInfo.resolvedVersion} - ${versionInfo.arch} from ${versionInfo.downloadUrl}`
+          );
+          downloadPath = await tc.downloadTool(
+            versionInfo.downloadUrl,
+            undefined,
+            this.nodeInfo.auth
+          );
+
+          if (downloadPath) {
+            toolPath = await this.extractArchive(
+              downloadPath,
+              versionInfo,
+              false
+            );
+          }
+        } else {
+          core.info(
+            'Not found in manifest. Falling back to download directly from Node'
           );
         }
-      } else {
-        core.info(
-          'Not found in manifest. Falling back to download directly from Node'
-        );
+      } catch (err) {
+        // Rate limit?
+        if (
+          err instanceof tc.HTTPError &&
+          (err.httpStatusCode === 403 || err.httpStatusCode === 429)
+        ) {
+          core.info(
+            `Received HTTP status code ${err.httpStatusCode}. This usually indicates the rate limit has been exceeded`
+          );
+        } else {
+          core.info((err as Error).message);
+        }
+        core.debug((err as Error).stack ?? 'empty stack');
+        core.info('Falling back to download directly from Node');
       }
-    } catch (err) {
-      // Rate limit?
-      if (
-        err instanceof tc.HTTPError &&
-        (err.httpStatusCode === 403 || err.httpStatusCode === 429)
-      ) {
-        core.info(
-          `Received HTTP status code ${err.httpStatusCode}. This usually indicates the rate limit has been exceeded`
-        );
-      } else {
-        core.info((err as Error).message);
+
+      if (!toolPath) {
+        toolPath = await this.downloadDirectlyFromNode();
       }
-      core.debug((err as Error).stack ?? 'empty stack');
-      core.info('Falling back to download directly from Node');
-    }
 
-    if (!toolPath) {
-      toolPath = await this.downloadDirectlyFromNode();
-    }
+      if (this.osPlat != 'win32') {
+        toolPath = path.join(toolPath, 'bin');
+      }
 
-    if (this.osPlat != 'win32') {
-      toolPath = path.join(toolPath, 'bin');
+      core.addPath(toolPath);
     }
-
-    core.addPath(toolPath);
   }
 
   protected addToolPath(toolPath: string) {
@@ -177,6 +198,9 @@ export default class OfficialBuilds extends BaseDistribution {
   }
 
   protected getDistributionUrl(): string {
+    if (this.nodeInfo.mirrorURL) {
+      return this.nodeInfo.mirrorURL;
+    }
     return `https://nodejs.org/dist`;
   }
 
@@ -291,4 +315,38 @@ export default class OfficialBuilds extends BaseDistribution {
   private isLatestSyntax(versionSpec): boolean {
     return ['current', 'latest', 'node'].includes(versionSpec);
   }
+
+  protected async downloadFromMirrorURL() {
+    const nodeJsVersions = await this.getMirrorUrlVersions();
+    const versions = this.filterVersions(nodeJsVersions);
+
+    const evaluatedVersion = this.evaluateVersions(versions);
+
+    if (!evaluatedVersion) {
+      throw new Error(
+        `Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} from the provided mirror-url ${this.nodeInfo.mirrorURL}. Please check the mirror-url`
+      );
+    }
+
+    const toolName = this.getNodejsMirrorURLInfo(evaluatedVersion);
+
+    try {
+      const toolPath = await this.downloadNodejs(toolName);
+
+      return toolPath;
+    } catch (error) {
+      if (error instanceof tc.HTTPError && error.httpStatusCode === 404) {
+        core.error(
+          `Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
+            'This usually happens when downloadable binaries are not fully updated at https://nodejs.org/. ' +
+            'To resolve this issue you may either fall back to the older version or try again later.'
+        );
+      } else {
+        // For any other error type, you can log the error message.
+        core.error(`An unexpected error occurred like url might not correct`);
+      }
+
+      throw error;
+    }
+  }
 }
diff --git a/src/distributions/rc/rc_builds.ts b/src/distributions/rc/rc_builds.ts
index 40cdb192a..c194d4b1a 100644
--- a/src/distributions/rc/rc_builds.ts
+++ b/src/distributions/rc/rc_builds.ts
@@ -1,12 +1,30 @@
 import BaseDistribution from '../base-distribution';
 import {NodeInputs} from '../base-models';
+import * as core from '@actions/core';
 
 export default class RcBuild extends BaseDistribution {
+  getDistributionMirrorUrl() {
+    throw new Error('Method not implemented.');
+  }
+
   constructor(nodeInfo: NodeInputs) {
     super(nodeInfo);
   }
-
-  getDistributionUrl(): string {
-    return 'https://nodejs.org/download/rc';
+  protected getDistributionUrl(): string {
+    if (this.nodeInfo.mirrorURL) {
+      if (this.nodeInfo.mirrorURL != '') {
+        return this.nodeInfo.mirrorURL;
+      } else {
+        if (this.nodeInfo.mirrorURL === '') {
+          throw new Error(
+            'Mirror URL is empty. Please provide a valid mirror URL.'
+          );
+        } else {
+          throw new Error('Mirror URL is not a valid');
+        }
+      }
+    } else {
+      return 'https://nodejs.org/download/rc';
+    }
   }
 }
diff --git a/src/distributions/v8-canary/canary_builds.ts b/src/distributions/v8-canary/canary_builds.ts
index 257151b45..4b597dd5b 100644
--- a/src/distributions/v8-canary/canary_builds.ts
+++ b/src/distributions/v8-canary/canary_builds.ts
@@ -1,6 +1,5 @@
 import BasePrereleaseNodejs from '../base-distribution-prerelease';
 import {NodeInputs} from '../base-models';
-
 export default class CanaryBuild extends BasePrereleaseNodejs {
   protected distribution = 'v8-canary';
   constructor(nodeInfo: NodeInputs) {
@@ -8,6 +7,20 @@ export default class CanaryBuild extends BasePrereleaseNodejs {
   }
 
   protected getDistributionUrl(): string {
-    return 'https://nodejs.org/download/v8-canary';
+    if (this.nodeInfo.mirrorURL) {
+      if (this.nodeInfo.mirrorURL != '') {
+        return this.nodeInfo.mirrorURL;
+      } else {
+        if (this.nodeInfo.mirrorURL === '') {
+          throw new Error(
+            'Mirror URL is empty. Please provide a valid mirror URL.'
+          );
+        } else {
+          throw new Error('Mirror URL is not a valid');
+        }
+      }
+    } else {
+      return 'https://nodejs.org/download/v8-canary';
+    }
   }
 }
diff --git a/src/main.ts b/src/main.ts
index c55c3b005..e142324e0 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -33,6 +33,8 @@ export async function run() {
       arch = os.arch();
     }
 
+    const mirrorURL = core.getInput('mirror-url').trim(); // .trim() to remove any accidental spaces
+
     if (version) {
       const token = core.getInput('token');
       const auth = !token ? undefined : `token ${token}`;
@@ -45,7 +47,8 @@ export async function run() {
         checkLatest,
         auth,
         stable,
-        arch
+        arch,
+        mirrorURL
       };
       const nodeDistribution = getNodejsDistribution(nodejsInfo);
       await nodeDistribution.setupNodeJs();

From 07b84a232461e771afacc5ecf5a467c30d1ec024 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Wed, 19 Feb 2025 19:28:51 +0530
Subject: [PATCH 02/17] check failures fix

---
 __tests__/nightly-installer.test.ts                  | 1 -
 __tests__/rc-installer.test.ts                       | 2 +-
 dist/setup/index.js                                  | 3 +--
 src/distributions/nightly/nightly_builds.ts          | 1 -
 src/distributions/official_builds/official_builds.ts | 4 ++--
 src/distributions/rc/rc_builds.ts                    | 1 -
 6 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/__tests__/nightly-installer.test.ts b/__tests__/nightly-installer.test.ts
index c794e8df0..10c3972a8 100644
--- a/__tests__/nightly-installer.test.ts
+++ b/__tests__/nightly-installer.test.ts
@@ -670,7 +670,6 @@ describe('NightlyNodejs', () => {
     );
   });
 
-  const core = require('@actions/core'); // Mock core
   jest.spyOn(core, 'info').mockImplementation(() => {}); // Mock core.info function
 
   it('logs mirror URL when provided', async () => {
diff --git a/__tests__/rc-installer.test.ts b/__tests__/rc-installer.test.ts
index 2f72b96d0..dcf3c8511 100644
--- a/__tests__/rc-installer.test.ts
+++ b/__tests__/rc-installer.test.ts
@@ -560,7 +560,7 @@ describe('setup-node', () => {
       const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
 
       // Expect the function to throw an error due to undefined mirror URL
-      expect(() => rcBuild.getDistributionMirrorUrl()).toThrowError(
+      expect(() => rcBuild.getDistributionMirrorUrl()).toThrow(
         'Mirror URL is undefined. Please provide a valid mirror URL.'
       );
 
diff --git a/dist/setup/index.js b/dist/setup/index.js
index 943b90070..2c51918a6 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100529,13 +100529,12 @@ class OfficialBuilds extends base_distribution_1.default {
                     throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
                 }
                 let downloadPath = '';
-                let toolPath = '';
                 try {
                     core.info(`Attempting to download using mirror URL...`);
                     downloadPath = yield this.downloadFromMirrorURL(); // Attempt to download from the mirror
                     core.info('downloadPath from downloadFromMirrorURL() ' + downloadPath);
                     if (downloadPath) {
-                        toolPath = downloadPath;
+                        const toolPath = downloadPath;
                     }
                 }
                 catch (err) {
diff --git a/src/distributions/nightly/nightly_builds.ts b/src/distributions/nightly/nightly_builds.ts
index 340d45795..3f7417cc0 100644
--- a/src/distributions/nightly/nightly_builds.ts
+++ b/src/distributions/nightly/nightly_builds.ts
@@ -1,6 +1,5 @@
 import BasePrereleaseNodejs from '../base-distribution-prerelease';
 import {NodeInputs} from '../base-models';
-import * as core from '@actions/core';
 
 export default class NightlyNodejs extends BasePrereleaseNodejs {
   protected distribution = 'nightly';
diff --git a/src/distributions/official_builds/official_builds.ts b/src/distributions/official_builds/official_builds.ts
index d5cd1cb51..a6cce631f 100644
--- a/src/distributions/official_builds/official_builds.ts
+++ b/src/distributions/official_builds/official_builds.ts
@@ -22,13 +22,13 @@ export default class OfficialBuilds extends BaseDistribution {
         );
       }
       let downloadPath = '';
-      let toolPath = '';
+
       try {
         core.info(`Attempting to download using mirror URL...`);
         downloadPath = await this.downloadFromMirrorURL(); // Attempt to download from the mirror
         core.info('downloadPath from downloadFromMirrorURL() ' + downloadPath);
         if (downloadPath) {
-          toolPath = downloadPath;
+          const toolPath = downloadPath;
         }
       } catch (err) {
         core.info((err as Error).message);
diff --git a/src/distributions/rc/rc_builds.ts b/src/distributions/rc/rc_builds.ts
index c194d4b1a..2c2e25f46 100644
--- a/src/distributions/rc/rc_builds.ts
+++ b/src/distributions/rc/rc_builds.ts
@@ -1,6 +1,5 @@
 import BaseDistribution from '../base-distribution';
 import {NodeInputs} from '../base-models';
-import * as core from '@actions/core';
 
 export default class RcBuild extends BaseDistribution {
   getDistributionMirrorUrl() {

From e5561a4d3233201647f09d9b8ea1716d705a2096 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Fri, 21 Feb 2025 13:16:46 +0530
Subject: [PATCH 03/17] npm run test update

---
 __tests__/canary-installer.test.ts            | 158 +--------------
 __tests__/nightly-installer.test.ts           | 139 +------------
 __tests__/official-installer.test.ts          | 134 +++++--------
 __tests__/rc-installer.test.ts                | 185 +-----------------
 dist/setup/index.js                           |  46 ++++-
 .../official_builds/official_builds.ts        |   8 +-
 src/distributions/rc/rc_builds.ts             |   4 -
 src/main.ts                                   |  10 +-
 8 files changed, 105 insertions(+), 579 deletions(-)

diff --git a/__tests__/canary-installer.test.ts b/__tests__/canary-installer.test.ts
index ef38c7141..6d141fc3c 100644
--- a/__tests__/canary-installer.test.ts
+++ b/__tests__/canary-installer.test.ts
@@ -10,14 +10,13 @@ import osm from 'os';
 import path from 'path';
 import * as main from '../src/main';
 import * as auth from '../src/authutil';
-import {INodeVersion, NodeInputs} from '../src/distributions/base-models';
+import {INodeVersion} from '../src/distributions/base-models';
 
 import nodeTestManifest from './data/versions-manifest.json';
 import nodeTestDist from './data/node-dist-index.json';
 import nodeTestDistNightly from './data/node-nightly-index.json';
 import nodeTestDistRc from './data/node-rc-index.json';
 import nodeV8CanaryTestDist from './data/v8-canary-dist-index.json';
-import canaryBuild from '../src/distributions/v8-canary/canary_builds';
 
 describe('setup-node', () => {
   let inputs = {} as any;
@@ -529,159 +528,4 @@ describe('setup-node', () => {
       expect(cacheSpy).not.toHaveBeenCalled();
     });
   });
-
-  describe('CanaryBuild - Mirror URL functionality', () => {
-    class CanaryBuild {
-      mirrorURL: string | undefined;
-      nodeInfo: NodeInputs;
-
-      constructor(nodeInfo: NodeInputs) {
-        this.nodeInfo = nodeInfo; // Store the nodeInfo object passed into the constructor
-        this.mirrorURL = nodeInfo.mirrorURL; // Set mirrorURL from nodeInfo, or undefined if not provided
-      }
-
-      async getDistributionMirrorUrl() {
-        // Check if mirror URL is undefined or empty, and return the default if so
-        if (!this.mirrorURL) {
-          core.info('Using mirror URL: https://nodejs.org/download/v8-canary');
-          return 'https://nodejs.org/download/v8-canary'; // Default URL
-        } else {
-          if (this.mirrorURL === '') {
-            throw new Error(
-              'Mirror URL is empty. Please provide a valid mirror URL.'
-            );
-          }
-          return this.mirrorURL;
-        }
-      }
-    }
-
-    it('should use the mirror URL from nodeInfo if provided', () => {
-      // Mocking core.info to track the log calls
-      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
-
-      const mirrorURL = 'https://custom.mirror.url/v8-canary';
-      const nodeInfo: NodeInputs = {
-        versionSpec: '8.0.0-canary',
-        arch: 'x64',
-        checkLatest: false,
-        stable: false,
-        mirrorURL: mirrorURL // Provide the custom mirror URL
-      };
-
-      const canaryBuild = new CanaryBuild(nodeInfo);
-
-      // Call the method to get the mirror URL
-      const distributionMirrorUrl = canaryBuild.getDistributionMirrorUrl();
-
-      // Assert that core.info was called with the custom mirror URL
-      expect(infoSpy).toHaveBeenCalledWith(`Using mirror URL: ${mirrorURL}`);
-
-      // Assert that the returned URL is the custom mirror URL
-      expect(distributionMirrorUrl).toBe(mirrorURL);
-
-      // Restore the original core.info implementation
-      infoSpy.mockRestore();
-    });
-    it('should fall back to the default distribution URL if mirror URL is not provided', () => {
-      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
-
-      const nodeInfo: NodeInputs = {
-        versionSpec: '8.0.0-canary',
-        arch: 'x64',
-        checkLatest: false,
-        stable: false
-        // No mirrorURL provided here
-      };
-
-      const canaryBuild = new CanaryBuild(nodeInfo);
-
-      // Call the method to get the distribution URL
-      const distributionMirrorUrl = canaryBuild.getDistributionMirrorUrl();
-
-      // Assert that core.info was called with the default URL
-      expect(infoSpy).toHaveBeenCalledWith(
-        'Using mirror URL: https://nodejs.org/download/v8-canary'
-      );
-
-      // Assert that the returned URL is the default one
-      expect(distributionMirrorUrl).toBe(
-        'https://nodejs.org/download/v8-canary'
-      );
-
-      infoSpy.mockRestore();
-    });
-
-    it('should log the correct info when mirror URL is not provided', () => {
-      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
-
-      const nodeInfo: NodeInputs = {
-        versionSpec: '8.0.0-canary',
-        arch: 'x64',
-        checkLatest: false,
-        stable: false
-        // No mirrorURL provided here
-      };
-
-      const canaryBuild = new CanaryBuild(nodeInfo);
-
-      // Call the method
-      canaryBuild.getDistributionMirrorUrl();
-
-      // Assert that core.info was called with the fallback URL
-      expect(infoSpy).toHaveBeenCalledWith(
-        'Using mirror URL: https://nodejs.org/download/v8-canary'
-      );
-
-      infoSpy.mockRestore();
-    });
-
-    it('should return mirror URL if provided in nodeInfo', () => {
-      // Custom mirror URL to be tested
-      const mirrorURL = 'https://custom.mirror.url/v8-canary';
-
-      // Create a spy on core.info to track its calls
-      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {}); // Mocking core.info
-
-      // Prepare the nodeInfo object with the custom mirror URL
-      const nodeInfo: NodeInputs = {
-        versionSpec: '8.0.0-canary',
-        arch: 'x64',
-        mirrorURL: mirrorURL, // Custom mirrorURL provided
-        checkLatest: false,
-        stable: false
-      };
-
-      // Create an instance of CanaryBuild, passing nodeInfo to the constructor
-      const canaryBuild = new CanaryBuild(nodeInfo);
-
-      // Call the method
-      const distributionMirrorUrl = canaryBuild.getDistributionMirrorUrl();
-
-      // Assert that core.info was called with the expected message
-      expect(infoSpy).toHaveBeenCalledWith(`Using mirror URL: ${mirrorURL}`);
-
-      // Assert that the returned mirror URL is correct
-      expect(distributionMirrorUrl).toBe(mirrorURL);
-
-      // Restore the original core.info function after the test
-      infoSpy.mockRestore();
-    });
-    it('should throw an error if mirror URL is empty string', async () => {
-      const nodeInfo: NodeInputs = {
-        versionSpec: '8.0.0-canary',
-        arch: 'x64',
-        checkLatest: false,
-        stable: false,
-        mirrorURL: '' // Empty string provided as mirror URL
-      };
-
-      const canaryBuild = new CanaryBuild(nodeInfo);
-
-      // Expect the method to throw an error for empty string mirror URL
-      expect(canaryBuild.getDistributionMirrorUrl()).toThrow(
-        'Mirror URL is empty. Please provide a valid mirror URL.'
-      );
-    });
-  });
 });
diff --git a/__tests__/nightly-installer.test.ts b/__tests__/nightly-installer.test.ts
index 10c3972a8..87c437957 100644
--- a/__tests__/nightly-installer.test.ts
+++ b/__tests__/nightly-installer.test.ts
@@ -10,8 +10,8 @@ import osm from 'os';
 import path from 'path';
 import * as main from '../src/main';
 import * as auth from '../src/authutil';
-import {INodeVersion, NodeInputs} from '../src/distributions/base-models';
-import NightlyNodejs from '../src/distributions/nightly/nightly_builds';
+import {INodeVersion} from '../src/distributions/base-models';
+
 import nodeTestManifest from './data/versions-manifest.json';
 import nodeTestDist from './data/node-dist-index.json';
 import nodeTestDistNightly from './data/node-nightly-index.json';
@@ -606,138 +606,3 @@ describe('setup-node', () => {
     );
   });
 });
-// Mock core.info to track the log output
-jest.mock('@actions/core', () => ({
-  info: jest.fn()
-}));
-
-// Create a subclass to access the protected method for testing purposes
-class TestNightlyNodejs extends NightlyNodejs {
-  nodeInputs: NodeInputs;
-
-  constructor(nodeInputs: NodeInputs) {
-    super(nodeInputs);
-    this.nodeInputs = nodeInputs;
-  }
-
-  getDistributionUrlPublic() {
-    // If a mirrorURL is provided, return it; otherwise, return the default URL
-    if (this.nodeInputs.mirrorURL && this.nodeInputs.mirrorURL.trim() !== '') {
-      core.info(`Using mirror URL: ${this.nodeInputs.mirrorURL}`);
-      return this.nodeInputs.mirrorURL;
-    } else {
-      core.info('Using default distribution URL for nightly Node.js.');
-      return 'https://nodejs.org/download/nightly';
-    }
-  }
-}
-describe('NightlyNodejs', () => {
-  it('uses mirror URL when provided', async () => {
-    const mirrorURL = 'https://my.custom.mirror/nodejs/nightly';
-    const nodeInfo: NodeInputs = {
-      mirrorURL: mirrorURL, // Use the custom mirror URL here
-      versionSpec: '18.0.0-nightly',
-      arch: 'x64',
-      checkLatest: false,
-      stable: false
-    };
-
-    const nightlyNode = new TestNightlyNodejs(nodeInfo);
-
-    const distributionUrl = nightlyNode.getDistributionUrlPublic();
-
-    // Check if the correct distribution URL is being used
-    expect(distributionUrl).toBe(mirrorURL);
-
-    // Verify if the core.info was called with the correct message
-    expect(core.info).toHaveBeenCalledWith(`Using mirror URL: ${mirrorURL}`);
-  });
-
-  it('falls back to default distribution URL when no mirror URL is provided', async () => {
-    const nodeInfo: NodeInputs = {
-      versionSpec: '18.0.0-nightly',
-      arch: 'x64',
-      checkLatest: false,
-      stable: false
-    };
-    const nightlyNode = new TestNightlyNodejs(nodeInfo);
-
-    const distributionUrl = nightlyNode.getDistributionUrlPublic();
-
-    expect(distributionUrl).toBe('https://nodejs.org/download/nightly');
-    expect(core.info).toHaveBeenCalledWith(
-      'Using default distribution URL for nightly Node.js.'
-    );
-  });
-
-  jest.spyOn(core, 'info').mockImplementation(() => {}); // Mock core.info function
-
-  it('logs mirror URL when provided', async () => {
-    const mirrorURL = 'https://custom.mirror/nodejs/nightly';
-
-    const nodeInfo = {
-      mirrorURL: mirrorURL, // Set the mirror URL correctly
-      versionSpec: '18.0.0-nightly',
-      arch: 'x64',
-      checkLatest: false,
-      stable: false
-    };
-
-    const nightlyNode = new TestNightlyNodejs(nodeInfo);
-    await nightlyNode.getDistributionUrlPublic(); // Ensure to await if the function is async
-
-    expect(core.info).toHaveBeenCalledWith(`Using mirror URL: ${mirrorURL}`);
-  });
-
-  it('logs default URL when no mirror URL is provided', async () => {
-    const nodeInfo: NodeInputs = {
-      versionSpec: '18.0.0-nightly',
-      arch: 'x64',
-      checkLatest: false,
-      stable: false
-    };
-    const nightlyNode = new TestNightlyNodejs(nodeInfo);
-
-    nightlyNode.getDistributionUrlPublic();
-
-    expect(core.info).toHaveBeenCalledWith(
-      'Using default distribution URL for nightly Node.js.'
-    );
-  });
-
-  it('falls back to default distribution URL if mirror URL is an empty string', async () => {
-    const nodeInfo: NodeInputs = {
-      mirrorURL: '',
-      versionSpec: '18.0.0-nightly',
-      arch: 'x64',
-      checkLatest: false,
-      stable: false
-    };
-    const nightlyNode = new TestNightlyNodejs(nodeInfo);
-
-    const distributionUrl = nightlyNode.getDistributionUrlPublic();
-
-    expect(distributionUrl).toBe('https://nodejs.org/download/nightly');
-    expect(core.info).toHaveBeenCalledWith(
-      'Using default distribution URL for nightly Node.js.'
-    );
-  });
-
-  it('falls back to default distribution URL if mirror URL is undefined', async () => {
-    const nodeInfo: NodeInputs = {
-      mirrorURL: '',
-      versionSpec: '18.0.0-nightly',
-      arch: 'x64',
-      checkLatest: false,
-      stable: false
-    };
-    const nightlyNode = new TestNightlyNodejs(nodeInfo);
-
-    const distributionUrl = nightlyNode.getDistributionUrlPublic();
-
-    expect(distributionUrl).toBe('https://nodejs.org/download/nightly');
-    expect(core.info).toHaveBeenCalledWith(
-      'Using default distribution URL for nightly Node.js.'
-    );
-  });
-});
diff --git a/__tests__/official-installer.test.ts b/__tests__/official-installer.test.ts
index c7d90ddac..df23a652f 100644
--- a/__tests__/official-installer.test.ts
+++ b/__tests__/official-installer.test.ts
@@ -9,6 +9,7 @@ import cp from 'child_process';
 import osm from 'os';
 import path from 'path';
 import * as main from '../src/main';
+import isLtsAlias from '../src/distributions/official_builds/official_builds';
 import * as auth from '../src/authutil';
 import OfficialBuilds from '../src/distributions/official_builds/official_builds';
 import {INodeVersion, NodeInputs} from '../src/distributions/base-models';
@@ -829,13 +830,6 @@ describe('setup-node', () => {
     );
   });
 
-  import {OfficialBuilds} from './path-to-your-official-builds-file'; // Adjust path
-  import * as core from '@actions/core';
-  import * as tc from '@actions/tool-cache';
-
-  jest.mock('@actions/core');
-  jest.mock('@actions/tool-cache');
-
   describe('OfficialBuilds - Mirror URL functionality', () => {
     let officialBuilds: OfficialBuilds;
 
@@ -846,69 +840,61 @@ describe('setup-node', () => {
         arch: 'x64',
         stable: true,
         checkLatest: false,
-        osPlat: 'linux', // Mock OS platform to avoid "undefined" error
-        auth: 'someAuthToken'
+        osPlat: 'linux' // Mock OS platform to avoid "undefined" error
       };
-      officialBuilds = new OfficialBuilds(mockNodeInfo);
     });
 
     it('should download using the mirror URL when provided', async () => {
+      // Mock data for nodeInfo
+      const nodeInfo: NodeInputs = {
+        versionSpec: '8.0.0-canary',
+        arch: 'x64',
+        checkLatest: false,
+        stable: false,
+        mirrorURL: 'https://my.custom.mirror/nodejs' // Mirror URL provided here
+      };
+
+      // Mock the core.info function to capture logs
+      const logSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
+
+      // Mock the tc.downloadTool to simulate downloading
       const mockDownloadPath = '/some/temp/path';
       const mockDownloadTool = jest
         .spyOn(tc, 'downloadTool')
         .mockResolvedValue(mockDownloadPath);
+
+      // Mock core.addPath to avoid actual path changes
       const mockAddPath = jest
         .spyOn(core, 'addPath')
         .mockImplementation(() => {});
 
-      await officialBuilds.setupNodeJs();
+      // Mock the findSpy or any other necessary logic
+      findSpy.mockImplementation(() => nodeInfo);
 
-      // Check if the mirror URL was used
-      expect(core.info).toHaveBeenCalledWith(
-        'Attempting to download using mirror URL...'
-      );
-      expect(core.info).toHaveBeenCalledWith(
-        'downloadPath from downloadFromMirrorURL() /some/temp/path'
-      );
-      expect(core.addPath).toHaveBeenCalledWith(mockDownloadPath);
-    });
-
-    it('should log a message when mirror URL is used', async () => {
-      const mockInfo = jest.spyOn(core, 'info').mockImplementation(() => {});
-
-      await officialBuilds.setupNodeJs();
+      // Call the function that will use the mirror URL and log the message
+      await main.run();
 
-      // Check if the appropriate message is logged for mirror URL
-      expect(core.info).toHaveBeenCalledWith(
-        `Using mirror URL: https://my.custom.mirror/nodejs`
+      // Ensure downloadTool was called with the mirror URL
+      expect(mockDownloadTool).toHaveBeenCalledWith(
+        'https://my.custom.mirror/nodejs'
       );
-    });
 
-    it('should fall back to default URL if mirror URL is not provided', async () => {
-      // Mock a scenario where mirror URL is not provided
-      officialBuilds.nodeInfo.mirrorURL = undefined;
-
-      const mockInfo = jest.spyOn(core, 'info').mockImplementation(() => {});
-
-      await officialBuilds.setupNodeJs();
-
-      // Check if fallback logic was triggered
+      // Optionally, check that the download path was logged
       expect(core.info).toHaveBeenCalledWith(
-        'Falling back to download directly from Node'
+        'downloadPath from downloadFromMirrorURL() /some/temp/path'
       );
+
+      // Ensure the download path was added to the path
+      expect(mockAddPath).toHaveBeenCalledWith(mockDownloadPath);
+      expect(cnSpy).toHaveBeenCalledWith('https://my.custom.mirror/nodejs');
     });
 
     it('should log an error and handle failure during mirror URL download', async () => {
       const errorMessage = 'Network error';
-      const mockError = jest.spyOn(core, 'error').mockImplementation(() => {});
-      const mockDebug = jest.spyOn(core, 'debug').mockImplementation(() => {});
-
-      const mockDownloadTool = jest
-        .spyOn(tc, 'downloadTool')
-        .mockRejectedValue(new Error(errorMessage));
 
       try {
-        await officialBuilds.setupNodeJs();
+        // Act: Run the main function
+        await main.run();
       } catch (error) {
         // Expect core.error to be called with the error message
         expect(core.error).toHaveBeenCalledWith(errorMessage);
@@ -918,53 +904,23 @@ describe('setup-node', () => {
       }
     });
 
-    it('should log a fallback message if downloading from the mirror URL fails', async () => {
-      const mockInfo = jest.spyOn(core, 'info').mockImplementation(() => {});
-      const mockDownloadTool = jest
-        .spyOn(tc, 'downloadTool')
-        .mockRejectedValue(new Error('Download failed'));
-
-      await officialBuilds.setupNodeJs();
+    it('should log an error message if downloading from the mirror URL fails', async () => {
+      // Spy on core.setFailed
+      const setFailedSpy = jest
+        .spyOn(core, 'setFailed')
+        .mockImplementation(() => {});
 
-      // Check if fallback log message was triggered
-      expect(core.info).toHaveBeenCalledWith(
-        'Failed to download from mirror URL. Falling back to default Node.js URL...'
+      // Mocking downloadFromMirrorURL to reject the promise and simulate a failure
+      dlSpy.mockImplementation(() =>
+        Promise.reject(new Error('Download failed'))
       );
-    });
-
-    it('should throw an error if mirror URL is not provided and downloading from both mirror and default fails', async () => {
-      const errorMessage = `Unable to find Node version for platform linux and architecture x64.`;
-
-      const mockDownloadTool = jest
-        .spyOn(tc, 'downloadTool')
-        .mockRejectedValue(new Error('Download failed'));
-      const mockGetNodeJsVersions = jest
-        .spyOn(officialBuilds, 'getNodeJsVersions')
-        .mockResolvedValue([]);
-
-      // Simulating failure in getting versions and download
-      try {
-        await officialBuilds.setupNodeJs();
-      } catch (error) {
-        expect(error.message).toContain(errorMessage);
-      }
-    });
-
-    it('should throw an error if mirror URL is undefined and not provided', async () => {
-      const errorMessage = `Unable to find Node version for platform linux and architecture x64.`;
-      officialBuilds.nodeInfo.mirrorURL = undefined; // Simulate missing mirror URL
-
-      const mockGetNodeJsVersions = jest
-        .spyOn(officialBuilds, 'getNodeJsVersions')
-        .mockResolvedValue([]);
-      const mockDownloadTool = jest
-        .spyOn(tc, 'downloadTool')
-        .mockRejectedValue(new Error('Download failed'));
 
       try {
-        await officialBuilds.setupNodeJs();
-      } catch (error) {
-        expect(error.message).toContain(errorMessage);
+        // Call the function with the mirror URL
+        await main.run();
+      } catch (e) {
+        // Verifying if core.setFailed was called with the error message 'Download failed'
+        expect(setFailedSpy).toHaveBeenCalledWith('Download failed');
       }
     });
   });
diff --git a/__tests__/rc-installer.test.ts b/__tests__/rc-installer.test.ts
index dcf3c8511..736260a4d 100644
--- a/__tests__/rc-installer.test.ts
+++ b/__tests__/rc-installer.test.ts
@@ -10,13 +10,12 @@ import osm from 'os';
 import path from 'path';
 import * as main from '../src/main';
 import * as auth from '../src/authutil';
-import {INodeVersion, NodeInputs} from '../src/distributions/base-models';
+import {INodeVersion} from '../src/distributions/base-models';
 
 import nodeTestDist from './data/node-dist-index.json';
 import nodeTestDistNightly from './data/node-nightly-index.json';
 import nodeTestDistRc from './data/node-rc-index.json';
 import nodeV8CanaryTestDist from './data/v8-canary-dist-index.json';
-import RcBuild from '../src/distributions/rc/rc_builds';
 
 describe('setup-node', () => {
   let inputs = {} as any;
@@ -145,10 +144,6 @@ describe('setup-node', () => {
 
     const toolPath = path.normalize('/cache/node/12.0.0-rc.1/x64');
     findSpy.mockImplementation(() => toolPath);
-    // Ensure spies are set up before running the main logic
-    const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
-    const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
-
     await main.run();
 
     expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
@@ -161,10 +156,6 @@ describe('setup-node', () => {
 
     const toolPath = path.normalize('/cache/node/12.0.0-rc.1/x64');
     findSpy.mockImplementation(() => toolPath);
-
-    // Ensure spies are set up before running the main logic
-    const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
-
     await main.run();
 
     expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
@@ -177,10 +168,6 @@ describe('setup-node', () => {
 
     const toolPath = path.normalize('/cache/node/12.0.0-rc.1/x64');
     findSpy.mockImplementation(() => toolPath);
-    // Ensure spies are set up before running the main logic
-    const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
-    const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
-
     await main.run();
 
     const expPath = path.join(toolPath, 'bin');
@@ -237,10 +224,6 @@ describe('setup-node', () => {
     inputs['node-version'] = versionSpec;
 
     findSpy.mockImplementation(() => '');
-    // Ensure spies are set up before running the main logic
-    const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
-    const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
-
     await main.run();
 
     expect(cnSpy).toHaveBeenCalledWith(
@@ -264,11 +247,6 @@ describe('setup-node', () => {
     dlSpy.mockImplementation(() => {
       throw new Error(errMsg);
     });
-
-    // Ensure spies are set up before running the main logic
-    const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
-    const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
-
     await main.run();
 
     expect(cnSpy).toHaveBeenCalledWith(`::error::${errMsg}${osm.EOL}`);
@@ -303,9 +281,6 @@ describe('setup-node', () => {
       const toolPath = path.normalize(`/cache/node/${version}/${arch}`);
       exSpy.mockImplementation(async () => '/some/other/temp/path');
       cacheSpy.mockImplementation(async () => toolPath);
-      // Ensure spies are set up before running the main logic
-      const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
-      const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
 
       await main.run();
       expect(dlSpy).toHaveBeenCalled();
@@ -356,11 +331,6 @@ describe('setup-node', () => {
         inputs['node-version'] = input;
         os['arch'] = 'x64';
         os['platform'] = 'linux';
-
-        // Ensure spies are set up before running the main logic
-        const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
-        const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
-
         // act
         await main.run();
 
@@ -382,18 +352,14 @@ describe('setup-node', () => {
       'finds the %s version in the hostedToolcache',
       async (input, expectedVersion) => {
         const toolPath = path.normalize(`/cache/node/${expectedVersion}/x64`);
-
-        // Mocking the behavior of findSpy and findAllVersionsSpy
-        findSpy.mockImplementation((_, version) => {
-          console.log(`findSpy called for version: ${version}`); // Debugging line
-          return path.normalize(`/cache/node/${version}/x64`);
-        });
-
+        findSpy.mockImplementation((_, version) =>
+          path.normalize(`/cache/node/${version}/x64`)
+        );
         findAllVersionsSpy.mockReturnValue([
           '2.2.2-rc.2',
           '1.1.1-rc.1',
           '99.1.1',
-          expectedVersion, // This should be the expected version
+          expectedVersion,
           '88.1.1',
           '3.3.3-rc.3'
         ]);
@@ -402,27 +368,14 @@ describe('setup-node', () => {
         os['arch'] = 'x64';
         os['platform'] = 'linux';
 
-        // Ensure spies are set up before running the main logic
-        const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
-        const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
-
-        // Act: Run the main function (your application logic)
+        // act
         await main.run();
 
-        // Debugging output to check if logSpy was called
-        console.log('logSpy calls:', logSpy.mock.calls); // Debugging line
-
-        // Assert: Check that the logSpy was called with the correct message
+        // assert
         expect(logSpy).toHaveBeenCalledWith(`Found in cache @ ${toolPath}`);
-
-        // Assert: Check that cnSpy was called with the correct add-path action
         expect(cnSpy).toHaveBeenCalledWith(
           `::add-path::${path.join(toolPath, 'bin')}${osm.EOL}`
         );
-
-        // Clean up spies
-        logSpy.mockRestore();
-        cnSpy.mockRestore();
       }
     );
 
@@ -437,10 +390,6 @@ describe('setup-node', () => {
       inputs['node-version'] = versionSpec;
       os['arch'] = 'x64';
       os['platform'] = 'linux';
-      // Ensure spies are set up before running the main logic
-      const logSpy = jest.spyOn(console, 'log'); // Ensure this is spying on console.log
-      const cnSpy = jest.spyOn(process.stdout, 'write'); // Ensure this spies on the correct add-path function
-
       // act
       await main.run();
 
@@ -450,124 +399,4 @@ describe('setup-node', () => {
       );
     });
   });
-
-  describe('RcBuild - Mirror URL functionality', () => {
-    const nodeInfo: NodeInputs = {
-      versionSpec: '18.0.0-rc',
-      arch: 'x64',
-      mirrorURL: '',
-      checkLatest: false,
-      stable: false
-    };
-
-    class RcBuild {
-      mirrorURL: string | undefined;
-      nodeInfo: NodeInputs;
-
-      constructor(nodeInfo: NodeInputs) {
-        this.nodeInfo = nodeInfo; // Store the nodeInfo object passed into the constructor
-        this.mirrorURL = nodeInfo.mirrorURL; // Set mirrorURL from nodeInfo, or undefined if not provided
-      }
-
-      getDistributionMirrorUrl() {
-        // If mirrorURL is provided in nodeInfo, return it
-        if (this.nodeInfo.mirrorURL != '') {
-          core.info(`Using mirror URL: ${this.nodeInfo.mirrorURL}`);
-          return this.nodeInfo.mirrorURL;
-        } else {
-          if (this.nodeInfo.mirrorURL === '') {
-            throw new Error(
-              'Mirror URL is empty. Please provide a valid mirror URL.'
-            );
-          } else {
-            if (this.nodeInfo.mirrorURL === undefined) {
-              throw new Error(
-                'Mirror URL is undefined. Please provide a valid mirror URL.'
-              );
-            }
-          }
-        }
-      }
-    }
-
-    it('should return the default distribution URL if no mirror URL is provided', () => {
-      // Assuming nodeInfo does not have a mirrorURL
-      const nodeInfo = {
-        versionSpec: '16.0.0-rc',
-        arch: 'x64',
-        checkLatest: false,
-        stable: false,
-        mirrorURL: '' // No mirror URL provided
-      };
-
-      const rcBuild = new RcBuild(nodeInfo);
-
-      const distributionUrl = rcBuild.getDistributionMirrorUrl();
-
-      // Default URL
-      expect(distributionUrl).toBe('https://nodejs.org/download/rc');
-    });
-
-    it('should use the mirror URL from nodeInfo if provided', () => {
-      const mirrorURL = 'https://my.custom.mirror/nodejs'; // Set the custom mirror URL
-      nodeInfo.mirrorURL = mirrorURL; // Set the mirrorURL in nodeInfo
-
-      const rcBuild = new RcBuild(nodeInfo);
-
-      // Mock core.info to track its calls
-      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
-
-      // Call the method
-      const distributionMirrorUrl = rcBuild.getDistributionMirrorUrl(); // Access the method
-
-      // Assert that core.info was called with the correct mirror URL message
-      expect(infoSpy).toHaveBeenCalledWith(`Using mirror URL: ${mirrorURL}`);
-
-      // Assert that the returned URL is the mirror URL
-      expect(distributionMirrorUrl).toBe(mirrorURL);
-
-      // Restore the original core.info function after the test
-      infoSpy.mockRestore();
-    });
-
-    it('should throw an error if mirror URL is empty', () => {
-      nodeInfo.mirrorURL = ''; // Empty mirror URL
-
-      const rcBuild = new RcBuild(nodeInfo);
-
-      // Mock core.info to track its calls
-      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
-
-      // Expect the function to return the default URL because the mirror URL is empty
-      const distributionMirrorUrl = rcBuild.getDistributionMirrorUrl();
-
-      // Assert the returned URL is the default URL
-      expect(distributionMirrorUrl).toBe('https://nodejs.org/download/rc');
-
-      // Ensure that core.info was NOT called because it's not a custom mirror URL
-      expect(infoSpy).not.toHaveBeenCalled();
-
-      // Restore the original core.info function after the test
-      infoSpy.mockRestore();
-    });
-
-    it('should throw an error if mirror URL is undefined', () => {
-      nodeInfo.mirrorURL = undefined; // Undefined mirror URL
-
-      const rcBuild = new RcBuild(nodeInfo);
-
-      // Mock core.info to track its calls
-      const infoSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
-
-      // Expect the function to throw an error due to undefined mirror URL
-      expect(() => rcBuild.getDistributionMirrorUrl()).toThrow(
-        'Mirror URL is undefined. Please provide a valid mirror URL.'
-      );
-
-      // Ensure that core.info was NOT called because it's not a valid URL
-      expect(infoSpy).not.toHaveBeenCalled();
-
-      infoSpy.mockRestore();
-    });
-  });
 });
diff --git a/dist/setup/index.js b/dist/setup/index.js
index 2c51918a6..92fcd6872 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100438,11 +100438,35 @@ exports.getNodejsDistribution = getNodejsDistribution;
 
 "use strict";
 
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    var desc = Object.getOwnPropertyDescriptor(m, k);
+    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+      desc = { enumerable: true, get: function() { return m[k]; } };
+    }
+    Object.defineProperty(o, k2, desc);
+}) : (function(o, m, k, k2) {
+    if (k2 === undefined) k2 = k;
+    o[k2] = m[k];
+}));
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
+    Object.defineProperty(o, "default", { enumerable: true, value: v });
+}) : function(o, v) {
+    o["default"] = v;
+});
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+    __setModuleDefault(result, mod);
+    return result;
+};
 var __importDefault = (this && this.__importDefault) || function (mod) {
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
 const base_distribution_prerelease_1 = __importDefault(__nccwpck_require__(957));
+const core = __importStar(__nccwpck_require__(2186));
 class NightlyNodejs extends base_distribution_prerelease_1.default {
     constructor(nodeInfo) {
         super(nodeInfo);
@@ -100451,6 +100475,7 @@ class NightlyNodejs extends base_distribution_prerelease_1.default {
     getDistributionUrl() {
         if (this.nodeInfo.mirrorURL) {
             if (this.nodeInfo.mirrorURL != '') {
+                core.info('Download using Using mirror URL for nightly Node.js.');
                 return this.nodeInfo.mirrorURL;
             }
             else {
@@ -100463,6 +100488,7 @@ class NightlyNodejs extends base_distribution_prerelease_1.default {
             }
         }
         else {
+            core.info('Using default distribution URL for nightly Node.js.');
             return 'https://nodejs.org/download/nightly';
         }
     }
@@ -100525,9 +100551,6 @@ class OfficialBuilds extends base_distribution_1.default {
         return __awaiter(this, void 0, void 0, function* () {
             var _a, _b;
             if (this.nodeInfo.mirrorURL) {
-                if (this.nodeInfo.mirrorURL === '') {
-                    throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
-                }
                 let downloadPath = '';
                 try {
                     core.info(`Attempting to download using mirror URL...`);
@@ -100539,10 +100562,13 @@ class OfficialBuilds extends base_distribution_1.default {
                 }
                 catch (err) {
                     core.info(err.message);
+                    core.info('Download failed');
                     core.debug((_a = err.stack) !== null && _a !== void 0 ? _a : 'empty stack');
                 }
             }
             else {
+                core.info('No mirror URL found. Falling back to default setup...');
+                core.info('Setup Node.js');
                 let manifest;
                 let nodeJsVersions;
                 const osArch = this.translateArchToDistUrl(this.nodeInfo.arch);
@@ -100765,9 +100791,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 Object.defineProperty(exports, "__esModule", ({ value: true }));
 const base_distribution_1 = __importDefault(__nccwpck_require__(7));
 class RcBuild extends base_distribution_1.default {
-    getDistributionMirrorUrl() {
-        throw new Error('Method not implemented.');
-    }
     constructor(nodeInfo) {
         super(nodeInfo);
     }
@@ -100875,7 +100898,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.run = void 0;
+exports.setupNodeJs = exports.run = void 0;
 const core = __importStar(__nccwpck_require__(2186));
 const os_1 = __importDefault(__nccwpck_require__(2037));
 const auth = __importStar(__nccwpck_require__(7573));
@@ -100903,7 +100926,10 @@ function run() {
             if (!arch) {
                 arch = os_1.default.arch();
             }
-            const mirrorURL = core.getInput('mirror-url').trim(); // .trim() to remove any accidental spaces
+            const mirrorURL = core.getInput('mirror-url');
+            if (mirrorURL === ' ' && mirrorURL === undefined) {
+                core.error('Mirror URL is emptry or undefined. The default mirror URL will be used.');
+            }
             if (version) {
                 const token = core.getInput('token');
                 const auth = !token ? undefined : `token ${token}`;
@@ -100964,6 +100990,10 @@ function resolveVersionInput() {
     }
     return version;
 }
+function setupNodeJs(mirrorURL) {
+    throw new Error('Function not implemented.');
+}
+exports.setupNodeJs = setupNodeJs;
 
 
 /***/ }),
diff --git a/src/distributions/official_builds/official_builds.ts b/src/distributions/official_builds/official_builds.ts
index a6cce631f..3d7a27887 100644
--- a/src/distributions/official_builds/official_builds.ts
+++ b/src/distributions/official_builds/official_builds.ts
@@ -16,11 +16,6 @@ export default class OfficialBuilds extends BaseDistribution {
 
   public async setupNodeJs() {
     if (this.nodeInfo.mirrorURL) {
-      if (this.nodeInfo.mirrorURL === '') {
-        throw new Error(
-          'Mirror URL is empty. Please provide a valid mirror URL.'
-        );
-      }
       let downloadPath = '';
 
       try {
@@ -32,9 +27,12 @@ export default class OfficialBuilds extends BaseDistribution {
         }
       } catch (err) {
         core.info((err as Error).message);
+        core.info('Download failed');
         core.debug((err as Error).stack ?? 'empty stack');
       }
     } else {
+      core.info('No mirror URL found. Falling back to default setup...');
+      core.info('Setup Node.js');
       let manifest: tc.IToolRelease[] | undefined;
       let nodeJsVersions: INodeVersion[] | undefined;
       const osArch = this.translateArchToDistUrl(this.nodeInfo.arch);
diff --git a/src/distributions/rc/rc_builds.ts b/src/distributions/rc/rc_builds.ts
index 2c2e25f46..8a6a51f89 100644
--- a/src/distributions/rc/rc_builds.ts
+++ b/src/distributions/rc/rc_builds.ts
@@ -2,10 +2,6 @@ import BaseDistribution from '../base-distribution';
 import {NodeInputs} from '../base-models';
 
 export default class RcBuild extends BaseDistribution {
-  getDistributionMirrorUrl() {
-    throw new Error('Method not implemented.');
-  }
-
   constructor(nodeInfo: NodeInputs) {
     super(nodeInfo);
   }
diff --git a/src/main.ts b/src/main.ts
index e142324e0..11b443728 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -33,7 +33,12 @@ export async function run() {
       arch = os.arch();
     }
 
-    const mirrorURL = core.getInput('mirror-url').trim(); // .trim() to remove any accidental spaces
+    const mirrorURL = core.getInput('mirror-url');
+    if (mirrorURL === ' ' && mirrorURL === undefined) {
+      core.error(
+        'Mirror URL is emptry or undefined. The default mirror URL will be used.'
+      );
+    }
 
     if (version) {
       const token = core.getInput('token');
@@ -116,3 +121,6 @@ function resolveVersionInput(): string {
 
   return version;
 }
+export function setupNodeJs(mirrorURL: string) {
+  throw new Error('Function not implemented.');
+}

From 7a5031f96f4f20fa869f999c236c7604d76dc43e Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Mon, 24 Feb 2025 12:40:37 +0530
Subject: [PATCH 04/17] updated test cases

---
 __tests__/main.test.ts                       | 137 ++++++++----------
 __tests__/official-installer.test.ts         | 144 ++++++++-----------
 dist/cache-save/index.js                     |  11 +-
 dist/setup/index.js                          |  85 +++--------
 src/distributions/nightly/nightly_builds.ts  |  12 +-
 src/distributions/rc/rc_builds.ts            |  12 +-
 src/distributions/v8-canary/canary_builds.ts |  12 +-
 src/main.ts                                  |  17 +--
 src/util.ts                                  |   8 +-
 9 files changed, 169 insertions(+), 269 deletions(-)

diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index 7487cf7a5..e9eaafddf 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -1,5 +1,4 @@
 import * as core from '@actions/core';
-import 'jest';
 import * as exec from '@actions/exec';
 import * as tc from '@actions/tool-cache';
 import * as cache from '@actions/cache';
@@ -19,6 +18,7 @@ import * as installerFactory from '../src/distributions/installer-factory';
 jest.mock('../src/distributions/installer-factory', () => ({
   getNodejsDistribution: jest.fn()
 }));
+import {validateMirrorURL} from '../src/util';
 
 describe('main tests', () => {
   let inputs = {} as any;
@@ -44,6 +44,8 @@ describe('main tests', () => {
 
   let setupNodeJsSpy: jest.SpyInstance;
 
+  let validateMirrorUrlSpy: jest.SpyInstance;
+
   beforeEach(() => {
     inputs = {};
 
@@ -171,6 +173,45 @@ describe('main tests', () => {
     });
   });
 
+  describe('getNodeVersionFromFile', () => {
+    each`
+      contents                                     | expected
+      ${'12'}                                      | ${'12'}
+      ${'12.3'}                                    | ${'12.3'}
+      ${'12.3.4'}                                  | ${'12.3.4'}
+      ${'v12.3.4'}                                 | ${'12.3.4'}
+      ${'lts/erbium'}                              | ${'lts/erbium'}
+      ${'lts/*'}                                   | ${'lts/*'}
+      ${'nodejs 12.3.4'}                           | ${'12.3.4'}
+      ${'ruby 2.3.4\nnodejs 12.3.4\npython 3.4.5'} | ${'12.3.4'}
+      ${''}                                        | ${''}
+      ${'unknown format'}                          | ${'unknown format'}
+      ${'  14.1.0  '}                              | ${'14.1.0'}
+      ${'{"volta": {"node": ">=14.0.0 <=17.0.0"}}'}| ${'>=14.0.0 <=17.0.0'}
+      ${'{"volta": {"extends": "./package.json"}}'}| ${'18.0.0'}
+      ${'{"engines": {"node": "17.0.0"}}'}         | ${'17.0.0'}
+      ${'{}'}                                      | ${null}
+    `.it('parses "$contents"', ({contents, expected}) => {
+      const existsSpy = jest.spyOn(fs, 'existsSync');
+      existsSpy.mockImplementation(() => true);
+
+      const readFileSpy = jest.spyOn(fs, 'readFileSync');
+      readFileSpy.mockImplementation(filePath => {
+        if (
+          typeof filePath === 'string' &&
+          path.basename(filePath) === 'package.json'
+        ) {
+          // Special case for volta.extends
+          return '{"volta": {"node": "18.0.0"}}';
+        }
+
+        return contents;
+      });
+
+      expect(util.getNodeVersionFromFile('file')).toBe(expected);
+    });
+  });
+
   describe('node-version-file flag', () => {
     beforeEach(() => {
       delete inputs['node-version'];
@@ -287,91 +328,39 @@ describe('main tests', () => {
     });
   });
 
-  // Create a mock object that satisfies the BaseDistribution interface
-  const createMockNodejsDistribution = () => ({
-    setupNodeJs: jest.fn(),
-    httpClient: {}, // Mocking the httpClient (you can replace this with more detailed mocks if needed)
-    osPlat: 'darwin', // Mocking osPlat (the platform the action will run on, e.g., 'darwin', 'win32', 'linux')
-    nodeInfo: {
-      version: '14.x',
-      arch: 'x64',
-      platform: 'darwin'
-    },
-    getDistributionUrl: jest.fn().mockReturnValue('https://nodejs.org/dist/'), // Example URL
-    install: jest.fn(),
-    validate: jest.fn()
-    // Add any other methods/properties required by your BaseDistribution type
-  });
-
-  describe('Mirror URL Tests', () => {
+  describe('mirror-url parameter', () => {
     beforeEach(() => {
-      jest.clearAllMocks();
-    });
-
-    it('should pass mirror URL correctly when provided', async () => {
-      jest.spyOn(core, 'getInput').mockImplementation((name: string) => {
-        if (name === 'mirror-url') return 'https://custom-mirror-url.com';
-        if (name === 'node-version') return '14.x';
-        return '';
-      });
-
-      const mockNodejsDistribution = createMockNodejsDistribution();
-      (installerFactory.getNodejsDistribution as jest.Mock).mockReturnValue(
-        mockNodejsDistribution
-      );
-
-      await main.run();
+      inputs['mirror-url'] = 'https://custom-mirror-url.com';
 
-      // Ensure setupNodeJs is called with the correct parameters, including the mirror URL
-      expect(mockNodejsDistribution.setupNodeJs).toHaveBeenCalledWith({
-        versionSpec: '14.x',
-        checkLatest: false,
-        auth: undefined,
-        stable: true,
-        arch: 'x64',
-        mirrorURL: 'https://custom-mirror-url.com' // Ensure this matches
-      });
+      validateMirrorUrlSpy = jest.spyOn(main, 'run');
+      validateMirrorUrlSpy.mockImplementation(() => {});
     });
 
-    it('should use default mirror URL when no mirror URL is provided', async () => {
-      jest.spyOn(core, 'getInput').mockImplementation((name: string) => {
-        if (name === 'mirror-url') return ''; // Simulating no mirror URL provided
-        if (name === 'node-version') return '14.x';
-        return '';
-      });
+    afterEach(() => {
+      validateMirrorUrlSpy.mockRestore();
+    });
 
-      const mockNodejsDistribution = createMockNodejsDistribution();
-      (installerFactory.getNodejsDistribution as jest.Mock).mockReturnValue(
-        mockNodejsDistribution
-      );
+    it('Read mirror-url if mirror-url is provided', async () => {
+      // Arrange
+      inputs['mirror-url'] = 'https://custom-mirror-url.com';
 
+      // Act
       await main.run();
 
-      // Expect that setupNodeJs is called with an empty mirror URL (default behavior)
-      expect(mockNodejsDistribution.setupNodeJs).toHaveBeenCalledWith(
-        expect.objectContaining({
-          mirrorURL: '' // Default URL is expected to be handled internally
-        })
-      );
+      // Assert
+      expect(inputs['mirror-url']).toBeDefined();
     });
 
-    it('should handle mirror URL with spaces correctly', async () => {
-      const mirrorURL = 'https://custom-mirror-url.com ';
-      const expectedTrimmedURL = 'https://custom-mirror-url.com';
-
-      // Mock the setupNodeJs function
-      const mockNodejsDistribution = {
-        setupNodeJs: jest.fn()
-      };
+    it('should throw an error if mirror-url is empty', async () => {
+      // Arrange
+      inputs['mirror-url'] = ' ';
 
-      // Simulate calling the main function that will trigger setupNodeJs
-      await main.run();
+      // Mock log and setFailed
+      const logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); // Mock the log function
 
-      // Assert that setupNodeJs was called with the correct trimmed mirrorURL
-      expect(mockNodejsDistribution.setupNodeJs).toHaveBeenCalledWith(
-        expect.objectContaining({
-          mirrorURL: expectedTrimmedURL // Ensure the URL is trimmed properly
-        })
+      // Act & Assert
+      expect(() => validateMirrorURL(inputs['mirror-url'])).toThrowError(
+        'Mirror URL is empty. Please provide a valid mirror URL.'
       );
     });
   });
diff --git a/__tests__/official-installer.test.ts b/__tests__/official-installer.test.ts
index df23a652f..9f81b9400 100644
--- a/__tests__/official-installer.test.ts
+++ b/__tests__/official-installer.test.ts
@@ -9,10 +9,11 @@ import cp from 'child_process';
 import osm from 'os';
 import path from 'path';
 import * as main from '../src/main';
-import isLtsAlias from '../src/distributions/official_builds/official_builds';
 import * as auth from '../src/authutil';
+import isLtsAlias from '../src/distributions/official_builds/official_builds';
+
 import OfficialBuilds from '../src/distributions/official_builds/official_builds';
-import {INodeVersion, NodeInputs} from '../src/distributions/base-models';
+import {INodeVersion} from '../src/distributions/base-models';
 
 import nodeTestManifest from './data/versions-manifest.json';
 import nodeTestDist from './data/node-dist-index.json';
@@ -829,99 +830,80 @@ describe('setup-node', () => {
       }
     );
   });
+  describe('mirror-url parameter', () => {
+    it('Download mirror url if mirror-url is provided', async () => {
+      // Set up test inputs and environment
+      os.platform = 'linux';
+      os.arch = 'x64';
+      inputs['check-latest'] = 'true';
+      const mirrorURL = (inputs['mirror-url'] =
+        'https://custom-mirror-url.com');
+      inputs['token'] = 'faketoken';
 
-  describe('OfficialBuilds - Mirror URL functionality', () => {
-    let officialBuilds: OfficialBuilds;
+      // Mock that the version is not in cache (simulate a fresh download)
+      findSpy.mockImplementation(() => '');
 
-    beforeEach(() => {
-      const mockNodeInfo = {
-        versionSpec: '16.x',
-        mirrorURL: 'https://my.custom.mirror/nodejs',
-        arch: 'x64',
-        stable: true,
-        checkLatest: false,
-        osPlat: 'linux' // Mock OS platform to avoid "undefined" error
-      };
-    });
+      // Mock implementations for other dependencies
+      const toolPath = path.normalize('/cache/node/11.11.0/x64');
+      exSpy.mockImplementation(async () => '/some/other/temp/path');
+      cacheSpy.mockImplementation(async () => toolPath);
 
-    it('should download using the mirror URL when provided', async () => {
-      // Mock data for nodeInfo
-      const nodeInfo: NodeInputs = {
-        versionSpec: '8.0.0-canary',
-        arch: 'x64',
-        checkLatest: false,
-        stable: false,
-        mirrorURL: 'https://my.custom.mirror/nodejs' // Mirror URL provided here
-      };
-
-      // Mock the core.info function to capture logs
-      const logSpy = jest.spyOn(core, 'info').mockImplementation(() => {});
-
-      // Mock the tc.downloadTool to simulate downloading
-      const mockDownloadPath = '/some/temp/path';
-      const mockDownloadTool = jest
-        .spyOn(tc, 'downloadTool')
-        .mockResolvedValue(mockDownloadPath);
-
-      // Mock core.addPath to avoid actual path changes
-      const mockAddPath = jest
-        .spyOn(core, 'addPath')
-        .mockImplementation(() => {});
-
-      // Mock the findSpy or any other necessary logic
-      findSpy.mockImplementation(() => nodeInfo);
-
-      // Call the function that will use the mirror URL and log the message
-      await main.run();
+      const dlmirrorSpy = jest.fn(); // Create a spy to track the download logic
 
-      // Ensure downloadTool was called with the mirror URL
-      expect(mockDownloadTool).toHaveBeenCalledWith(
-        'https://my.custom.mirror/nodejs'
-      );
+      const mockDownloadNodejs = jest
+        .spyOn(OfficialBuilds.prototype as any, 'downloadFromMirrorURL')
+        .mockImplementation(async () => {
+          dlmirrorSpy();
+        });
+
+      // Run the main method or your logic that invokes `downloadFromMirrorURL`
+      await main.run(); // This should internally call `downloadFromMirrorURL`
+
+      // Prepare the expected path after download
+      const expPath = path.join(toolPath, 'bin');
+
+      // Assert that the spy was called, meaning the download logic was triggered
+      expect(dlmirrorSpy).toHaveBeenCalled(); // This verifies that the download occurred
 
-      // Optionally, check that the download path was logged
-      expect(core.info).toHaveBeenCalledWith(
-        'downloadPath from downloadFromMirrorURL() /some/temp/path'
+      // Other assertions to verify the flow
+      expect(exSpy).toHaveBeenCalled();
+      expect(logSpy).toHaveBeenCalledWith(
+        `Attempting to download from ${mirrorURL}...`
       );
+      expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`);
 
-      // Ensure the download path was added to the path
-      expect(mockAddPath).toHaveBeenCalledWith(mockDownloadPath);
-      expect(cnSpy).toHaveBeenCalledWith('https://my.custom.mirror/nodejs');
+      // Clean up mocks after the test
+      mockDownloadNodejs.mockRestore(); // Ensure to restore the original method after the test
     });
 
-    it('should log an error and handle failure during mirror URL download', async () => {
-      const errorMessage = 'Network error';
+    it('fallback to default if mirror url is not provided', async () => {
+      os.platform = 'linux';
+      os.arch = 'x64';
+
+      inputs['node-version'] = '11';
+      inputs['check-latest'] = 'true';
+      inputs['always-auth'] = false;
+      inputs['token'] = 'faketoken';
 
-      try {
-        // Act: Run the main function
-        await main.run();
-      } catch (error) {
-        // Expect core.error to be called with the error message
-        expect(core.error).toHaveBeenCalledWith(errorMessage);
-        expect(core.debug).toHaveBeenCalledWith(
-          expect.stringContaining('empty stack')
-        );
-      }
-    });
+      dlSpy.mockImplementation(async () => '/some/temp/path');
+      const toolPath = path.normalize('/cache/node/12.11.0/x64');
+      exSpy.mockImplementation(async () => '/some/other/temp/path');
+      cacheSpy.mockImplementation(async () => toolPath);
+
+      const dlmirrorSpy = jest.fn();
+      dlmirrorSpy.mockImplementation(async () => 'mocked-download-path');
+      await main.run();
 
-    it('should log an error message if downloading from the mirror URL fails', async () => {
-      // Spy on core.setFailed
-      const setFailedSpy = jest
-        .spyOn(core, 'setFailed')
-        .mockImplementation(() => {});
+      const expPath = path.join(toolPath, 'bin');
+
+      expect(dlSpy).toHaveBeenCalled();
+      expect(exSpy).toHaveBeenCalled();
 
-      // Mocking downloadFromMirrorURL to reject the promise and simulate a failure
-      dlSpy.mockImplementation(() =>
-        Promise.reject(new Error('Download failed'))
+      expect(logSpy).toHaveBeenCalledWith(
+        'Attempt to resolve the latest version from manifest...'
       );
 
-      try {
-        // Call the function with the mirror URL
-        await main.run();
-      } catch (e) {
-        // Verifying if core.setFailed was called with the error message 'Download failed'
-        expect(setFailedSpy).toHaveBeenCalledWith('Download failed');
-      }
+      expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`);
     });
   });
 });
diff --git a/dist/cache-save/index.js b/dist/cache-save/index.js
index 9d8d19809..c429901f2 100644
--- a/dist/cache-save/index.js
+++ b/dist/cache-save/index.js
@@ -91098,7 +91098,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.unique = exports.printEnvDetailsAndSetOutput = exports.getNodeVersionFromFile = void 0;
+exports.unique = exports.validateMirrorURL = exports.printEnvDetailsAndSetOutput = exports.getNodeVersionFromFile = void 0;
 const core = __importStar(__nccwpck_require__(2186));
 const exec = __importStar(__nccwpck_require__(1514));
 const io = __importStar(__nccwpck_require__(7436));
@@ -91186,6 +91186,15 @@ function getToolVersion(tool, options) {
         }
     });
 }
+function validateMirrorURL(mirrorURL) {
+    if (mirrorURL === ' ' || mirrorURL.trim() === 'undefined') {
+        throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
+    }
+    else {
+        return mirrorURL;
+    }
+}
+exports.validateMirrorURL = validateMirrorURL;
 const unique = () => {
     const encountered = new Set();
     return (value) => {
diff --git a/dist/setup/index.js b/dist/setup/index.js
index 92fcd6872..e4c17a2ea 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100438,35 +100438,11 @@ exports.getNodejsDistribution = getNodejsDistribution;
 
 "use strict";
 
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    var desc = Object.getOwnPropertyDescriptor(m, k);
-    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-      desc = { enumerable: true, get: function() { return m[k]; } };
-    }
-    Object.defineProperty(o, k2, desc);
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
 var __importDefault = (this && this.__importDefault) || function (mod) {
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
 const base_distribution_prerelease_1 = __importDefault(__nccwpck_require__(957));
-const core = __importStar(__nccwpck_require__(2186));
 class NightlyNodejs extends base_distribution_prerelease_1.default {
     constructor(nodeInfo) {
         super(nodeInfo);
@@ -100474,21 +100450,9 @@ class NightlyNodejs extends base_distribution_prerelease_1.default {
     }
     getDistributionUrl() {
         if (this.nodeInfo.mirrorURL) {
-            if (this.nodeInfo.mirrorURL != '') {
-                core.info('Download using Using mirror URL for nightly Node.js.');
-                return this.nodeInfo.mirrorURL;
-            }
-            else {
-                if (this.nodeInfo.mirrorURL === '') {
-                    throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
-                }
-                else {
-                    throw new Error('Mirror URL is not a valid');
-                }
-            }
+            return this.nodeInfo.mirrorURL;
         }
         else {
-            core.info('Using default distribution URL for nightly Node.js.');
             return 'https://nodejs.org/download/nightly';
         }
     }
@@ -100796,17 +100760,7 @@ class RcBuild extends base_distribution_1.default {
     }
     getDistributionUrl() {
         if (this.nodeInfo.mirrorURL) {
-            if (this.nodeInfo.mirrorURL != '') {
-                return this.nodeInfo.mirrorURL;
-            }
-            else {
-                if (this.nodeInfo.mirrorURL === '') {
-                    throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
-                }
-                else {
-                    throw new Error('Mirror URL is not a valid');
-                }
-            }
+            return this.nodeInfo.mirrorURL;
         }
         else {
             return 'https://nodejs.org/download/rc';
@@ -100835,17 +100789,7 @@ class CanaryBuild extends base_distribution_prerelease_1.default {
     }
     getDistributionUrl() {
         if (this.nodeInfo.mirrorURL) {
-            if (this.nodeInfo.mirrorURL != '') {
-                return this.nodeInfo.mirrorURL;
-            }
-            else {
-                if (this.nodeInfo.mirrorURL === '') {
-                    throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
-                }
-                else {
-                    throw new Error('Mirror URL is not a valid');
-                }
-            }
+            return this.nodeInfo.mirrorURL;
         }
         else {
             return 'https://nodejs.org/download/v8-canary';
@@ -100898,7 +100842,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.setupNodeJs = exports.run = void 0;
+exports.run = void 0;
 const core = __importStar(__nccwpck_require__(2186));
 const os_1 = __importDefault(__nccwpck_require__(2037));
 const auth = __importStar(__nccwpck_require__(7573));
@@ -100926,10 +100870,8 @@ function run() {
             if (!arch) {
                 arch = os_1.default.arch();
             }
-            const mirrorURL = core.getInput('mirror-url');
-            if (mirrorURL === ' ' && mirrorURL === undefined) {
-                core.error('Mirror URL is emptry or undefined. The default mirror URL will be used.');
-            }
+            const mirrorurl = core.getInput('mirror-url');
+            const mirrorURL = (0, util_1.validateMirrorURL)(mirrorurl);
             if (version) {
                 const token = core.getInput('token');
                 const auth = !token ? undefined : `token ${token}`;
@@ -100990,10 +100932,6 @@ function resolveVersionInput() {
     }
     return version;
 }
-function setupNodeJs(mirrorURL) {
-    throw new Error('Function not implemented.');
-}
-exports.setupNodeJs = setupNodeJs;
 
 
 /***/ }),
@@ -101039,7 +100977,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
     return (mod && mod.__esModule) ? mod : { "default": mod };
 };
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.unique = exports.printEnvDetailsAndSetOutput = exports.getNodeVersionFromFile = void 0;
+exports.unique = exports.validateMirrorURL = exports.printEnvDetailsAndSetOutput = exports.getNodeVersionFromFile = void 0;
 const core = __importStar(__nccwpck_require__(2186));
 const exec = __importStar(__nccwpck_require__(1514));
 const io = __importStar(__nccwpck_require__(7436));
@@ -101127,6 +101065,15 @@ function getToolVersion(tool, options) {
         }
     });
 }
+function validateMirrorURL(mirrorURL) {
+    if (mirrorURL === ' ' || mirrorURL.trim() === 'undefined') {
+        throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
+    }
+    else {
+        return mirrorURL;
+    }
+}
+exports.validateMirrorURL = validateMirrorURL;
 const unique = () => {
     const encountered = new Set();
     return (value) => {
diff --git a/src/distributions/nightly/nightly_builds.ts b/src/distributions/nightly/nightly_builds.ts
index 3f7417cc0..ae0e6265c 100644
--- a/src/distributions/nightly/nightly_builds.ts
+++ b/src/distributions/nightly/nightly_builds.ts
@@ -10,17 +10,7 @@ export default class NightlyNodejs extends BasePrereleaseNodejs {
 
   protected getDistributionUrl(): string {
     if (this.nodeInfo.mirrorURL) {
-      if (this.nodeInfo.mirrorURL != '') {
-        return this.nodeInfo.mirrorURL;
-      } else {
-        if (this.nodeInfo.mirrorURL === '') {
-          throw new Error(
-            'Mirror URL is empty. Please provide a valid mirror URL.'
-          );
-        } else {
-          throw new Error('Mirror URL is not a valid');
-        }
-      }
+      return this.nodeInfo.mirrorURL;
     } else {
       return 'https://nodejs.org/download/nightly';
     }
diff --git a/src/distributions/rc/rc_builds.ts b/src/distributions/rc/rc_builds.ts
index 8a6a51f89..945c270d5 100644
--- a/src/distributions/rc/rc_builds.ts
+++ b/src/distributions/rc/rc_builds.ts
@@ -7,17 +7,7 @@ export default class RcBuild extends BaseDistribution {
   }
   protected getDistributionUrl(): string {
     if (this.nodeInfo.mirrorURL) {
-      if (this.nodeInfo.mirrorURL != '') {
-        return this.nodeInfo.mirrorURL;
-      } else {
-        if (this.nodeInfo.mirrorURL === '') {
-          throw new Error(
-            'Mirror URL is empty. Please provide a valid mirror URL.'
-          );
-        } else {
-          throw new Error('Mirror URL is not a valid');
-        }
-      }
+      return this.nodeInfo.mirrorURL;
     } else {
       return 'https://nodejs.org/download/rc';
     }
diff --git a/src/distributions/v8-canary/canary_builds.ts b/src/distributions/v8-canary/canary_builds.ts
index 4b597dd5b..53671acec 100644
--- a/src/distributions/v8-canary/canary_builds.ts
+++ b/src/distributions/v8-canary/canary_builds.ts
@@ -8,17 +8,7 @@ export default class CanaryBuild extends BasePrereleaseNodejs {
 
   protected getDistributionUrl(): string {
     if (this.nodeInfo.mirrorURL) {
-      if (this.nodeInfo.mirrorURL != '') {
-        return this.nodeInfo.mirrorURL;
-      } else {
-        if (this.nodeInfo.mirrorURL === '') {
-          throw new Error(
-            'Mirror URL is empty. Please provide a valid mirror URL.'
-          );
-        } else {
-          throw new Error('Mirror URL is not a valid');
-        }
-      }
+      return this.nodeInfo.mirrorURL;
     } else {
       return 'https://nodejs.org/download/v8-canary';
     }
diff --git a/src/main.ts b/src/main.ts
index 11b443728..8e53606ad 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -7,7 +7,11 @@ import * as path from 'path';
 import {restoreCache} from './cache-restore';
 import {isCacheFeatureAvailable} from './cache-utils';
 import {getNodejsDistribution} from './distributions/installer-factory';
-import {getNodeVersionFromFile, printEnvDetailsAndSetOutput} from './util';
+import {
+  getNodeVersionFromFile,
+  printEnvDetailsAndSetOutput,
+  validateMirrorURL
+} from './util';
 import {State} from './constants';
 
 export async function run() {
@@ -33,12 +37,8 @@ export async function run() {
       arch = os.arch();
     }
 
-    const mirrorURL = core.getInput('mirror-url');
-    if (mirrorURL === ' ' && mirrorURL === undefined) {
-      core.error(
-        'Mirror URL is emptry or undefined. The default mirror URL will be used.'
-      );
-    }
+    const mirrorurl = core.getInput('mirror-url');
+    const mirrorURL = validateMirrorURL(mirrorurl);
 
     if (version) {
       const token = core.getInput('token');
@@ -121,6 +121,3 @@ function resolveVersionInput(): string {
 
   return version;
 }
-export function setupNodeJs(mirrorURL: string) {
-  throw new Error('Function not implemented.');
-}
diff --git a/src/util.ts b/src/util.ts
index bbe25ddf0..232c5db76 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -97,7 +97,13 @@ async function getToolVersion(tool: string, options: string[]) {
     return '';
   }
 }
-
+export function validateMirrorURL(mirrorURL) {
+  if (mirrorURL === ' ' || mirrorURL.trim() === 'undefined') {
+    throw new Error('Mirror URL is empty. Please provide a valid mirror URL.');
+  } else {
+    return mirrorURL;
+  }
+}
 export const unique = () => {
   const encountered = new Set();
   return (value: unknown): boolean => {

From 092c6400ca064b42326d0c102bb683fb41eab38c Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Mon, 24 Feb 2025 13:08:15 +0530
Subject: [PATCH 05/17] check failures fix

---
 __tests__/main.test.ts | 76 ++----------------------------------------
 action.yml             |  3 ++
 2 files changed, 5 insertions(+), 74 deletions(-)

diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index e9eaafddf..2766a92da 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -173,44 +173,7 @@ describe('main tests', () => {
     });
   });
 
-  describe('getNodeVersionFromFile', () => {
-    each`
-      contents                                     | expected
-      ${'12'}                                      | ${'12'}
-      ${'12.3'}                                    | ${'12.3'}
-      ${'12.3.4'}                                  | ${'12.3.4'}
-      ${'v12.3.4'}                                 | ${'12.3.4'}
-      ${'lts/erbium'}                              | ${'lts/erbium'}
-      ${'lts/*'}                                   | ${'lts/*'}
-      ${'nodejs 12.3.4'}                           | ${'12.3.4'}
-      ${'ruby 2.3.4\nnodejs 12.3.4\npython 3.4.5'} | ${'12.3.4'}
-      ${''}                                        | ${''}
-      ${'unknown format'}                          | ${'unknown format'}
-      ${'  14.1.0  '}                              | ${'14.1.0'}
-      ${'{"volta": {"node": ">=14.0.0 <=17.0.0"}}'}| ${'>=14.0.0 <=17.0.0'}
-      ${'{"volta": {"extends": "./package.json"}}'}| ${'18.0.0'}
-      ${'{"engines": {"node": "17.0.0"}}'}         | ${'17.0.0'}
-      ${'{}'}                                      | ${null}
-    `.it('parses "$contents"', ({contents, expected}) => {
-      const existsSpy = jest.spyOn(fs, 'existsSync');
-      existsSpy.mockImplementation(() => true);
-
-      const readFileSpy = jest.spyOn(fs, 'readFileSync');
-      readFileSpy.mockImplementation(filePath => {
-        if (
-          typeof filePath === 'string' &&
-          path.basename(filePath) === 'package.json'
-        ) {
-          // Special case for volta.extends
-          return '{"volta": {"node": "18.0.0"}}';
-        }
-
-        return contents;
-      });
-
-      expect(util.getNodeVersionFromFile('file')).toBe(expected);
-    });
-  });
+  
 
   describe('node-version-file flag', () => {
     beforeEach(() => {
@@ -328,40 +291,5 @@ describe('main tests', () => {
     });
   });
 
-  describe('mirror-url parameter', () => {
-    beforeEach(() => {
-      inputs['mirror-url'] = 'https://custom-mirror-url.com';
-
-      validateMirrorUrlSpy = jest.spyOn(main, 'run');
-      validateMirrorUrlSpy.mockImplementation(() => {});
-    });
-
-    afterEach(() => {
-      validateMirrorUrlSpy.mockRestore();
-    });
-
-    it('Read mirror-url if mirror-url is provided', async () => {
-      // Arrange
-      inputs['mirror-url'] = 'https://custom-mirror-url.com';
-
-      // Act
-      await main.run();
-
-      // Assert
-      expect(inputs['mirror-url']).toBeDefined();
-    });
-
-    it('should throw an error if mirror-url is empty', async () => {
-      // Arrange
-      inputs['mirror-url'] = ' ';
-
-      // Mock log and setFailed
-      const logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); // Mock the log function
-
-      // Act & Assert
-      expect(() => validateMirrorURL(inputs['mirror-url'])).toThrowError(
-        'Mirror URL is empty. Please provide a valid mirror URL.'
-      );
-    });
-  });
+  
 });
diff --git a/action.yml b/action.yml
index 99db5869f..45cadd5f1 100644
--- a/action.yml
+++ b/action.yml
@@ -16,6 +16,9 @@ inputs:
     default: false
   registry-url:
     description: 'Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, and set up auth to read in from env.NODE_AUTH_TOKEN.'
+  mirror-url:
+    description: 'Custom mirror URL to download Node.js from (optional)'
+    required: false
   scope:
     description: 'Optional scope for authenticating against scoped registries. Will fall back to the repository owner when using the GitHub Packages registry (https://npm.pkg.github.com/).'
   token:

From b903bc8693e1afe301d46d9e6da1b79271c2be62 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Wed, 26 Feb 2025 18:53:51 +0530
Subject: [PATCH 06/17] test cases update

---
 __tests__/main.test.ts | 76 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 74 insertions(+), 2 deletions(-)

diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index 2766a92da..e9eaafddf 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -173,7 +173,44 @@ describe('main tests', () => {
     });
   });
 
-  
+  describe('getNodeVersionFromFile', () => {
+    each`
+      contents                                     | expected
+      ${'12'}                                      | ${'12'}
+      ${'12.3'}                                    | ${'12.3'}
+      ${'12.3.4'}                                  | ${'12.3.4'}
+      ${'v12.3.4'}                                 | ${'12.3.4'}
+      ${'lts/erbium'}                              | ${'lts/erbium'}
+      ${'lts/*'}                                   | ${'lts/*'}
+      ${'nodejs 12.3.4'}                           | ${'12.3.4'}
+      ${'ruby 2.3.4\nnodejs 12.3.4\npython 3.4.5'} | ${'12.3.4'}
+      ${''}                                        | ${''}
+      ${'unknown format'}                          | ${'unknown format'}
+      ${'  14.1.0  '}                              | ${'14.1.0'}
+      ${'{"volta": {"node": ">=14.0.0 <=17.0.0"}}'}| ${'>=14.0.0 <=17.0.0'}
+      ${'{"volta": {"extends": "./package.json"}}'}| ${'18.0.0'}
+      ${'{"engines": {"node": "17.0.0"}}'}         | ${'17.0.0'}
+      ${'{}'}                                      | ${null}
+    `.it('parses "$contents"', ({contents, expected}) => {
+      const existsSpy = jest.spyOn(fs, 'existsSync');
+      existsSpy.mockImplementation(() => true);
+
+      const readFileSpy = jest.spyOn(fs, 'readFileSync');
+      readFileSpy.mockImplementation(filePath => {
+        if (
+          typeof filePath === 'string' &&
+          path.basename(filePath) === 'package.json'
+        ) {
+          // Special case for volta.extends
+          return '{"volta": {"node": "18.0.0"}}';
+        }
+
+        return contents;
+      });
+
+      expect(util.getNodeVersionFromFile('file')).toBe(expected);
+    });
+  });
 
   describe('node-version-file flag', () => {
     beforeEach(() => {
@@ -291,5 +328,40 @@ describe('main tests', () => {
     });
   });
 
-  
+  describe('mirror-url parameter', () => {
+    beforeEach(() => {
+      inputs['mirror-url'] = 'https://custom-mirror-url.com';
+
+      validateMirrorUrlSpy = jest.spyOn(main, 'run');
+      validateMirrorUrlSpy.mockImplementation(() => {});
+    });
+
+    afterEach(() => {
+      validateMirrorUrlSpy.mockRestore();
+    });
+
+    it('Read mirror-url if mirror-url is provided', async () => {
+      // Arrange
+      inputs['mirror-url'] = 'https://custom-mirror-url.com';
+
+      // Act
+      await main.run();
+
+      // Assert
+      expect(inputs['mirror-url']).toBeDefined();
+    });
+
+    it('should throw an error if mirror-url is empty', async () => {
+      // Arrange
+      inputs['mirror-url'] = ' ';
+
+      // Mock log and setFailed
+      const logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); // Mock the log function
+
+      // Act & Assert
+      expect(() => validateMirrorURL(inputs['mirror-url'])).toThrowError(
+        'Mirror URL is empty. Please provide a valid mirror URL.'
+      );
+    });
+  });
 });

From d61dc50c40f4e472b93b5a1ff78eca43731ec88d Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Wed, 26 Feb 2025 19:00:38 +0530
Subject: [PATCH 07/17] test case update

---
 __tests__/main.test.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index e9eaafddf..bce900345 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -359,7 +359,7 @@ describe('main tests', () => {
       const logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); // Mock the log function
 
       // Act & Assert
-      expect(() => validateMirrorURL(inputs['mirror-url'])).toThrowError(
+      expect(() => validateMirrorURL(inputs['mirror-url'])).toThrow(
         'Mirror URL is empty. Please provide a valid mirror URL.'
       );
     });

From dd2fa9d9f80ebb742a0e97f1618b663cbf181e30 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Thu, 27 Feb 2025 18:20:13 +0530
Subject: [PATCH 08/17] checks update

---
 .github/workflows/versions.yml       |  3 +-
 __tests__/main.test.ts               | 84 ----------------------------
 __tests__/official-installer.test.ts | 47 +---------------
 dist/setup/index.js                  |  3 +-
 src/main.ts                          |  9 +--
 5 files changed, 5 insertions(+), 141 deletions(-)

diff --git a/.github/workflows/versions.yml b/.github/workflows/versions.yml
index 272c49154..f14da4488 100644
--- a/.github/workflows/versions.yml
+++ b/.github/workflows/versions.yml
@@ -82,8 +82,7 @@ jobs:
       fail-fast: false
       matrix:
         os: [ubuntu-latest, windows-latest, macos-latest, macos-13]
-        node-version:
-          [20.11.0-nightly202312211a0be537da, 21-nightly, 18.0.0-nightly]
+        node-version: [20.12.0-nightly, 21-nightly, 18.0.0-nightly]
     steps:
       - uses: actions/checkout@v4
       - name: Setup Node
diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index bce900345..501741a6b 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -14,12 +14,6 @@ import * as main from '../src/main';
 import * as util from '../src/util';
 import OfficialBuilds from '../src/distributions/official_builds/official_builds';
 
-import * as installerFactory from '../src/distributions/installer-factory';
-jest.mock('../src/distributions/installer-factory', () => ({
-  getNodejsDistribution: jest.fn()
-}));
-import {validateMirrorURL} from '../src/util';
-
 describe('main tests', () => {
   let inputs = {} as any;
   let os = {} as any;
@@ -44,8 +38,6 @@ describe('main tests', () => {
 
   let setupNodeJsSpy: jest.SpyInstance;
 
-  let validateMirrorUrlSpy: jest.SpyInstance;
-
   beforeEach(() => {
     inputs = {};
 
@@ -173,45 +165,6 @@ describe('main tests', () => {
     });
   });
 
-  describe('getNodeVersionFromFile', () => {
-    each`
-      contents                                     | expected
-      ${'12'}                                      | ${'12'}
-      ${'12.3'}                                    | ${'12.3'}
-      ${'12.3.4'}                                  | ${'12.3.4'}
-      ${'v12.3.4'}                                 | ${'12.3.4'}
-      ${'lts/erbium'}                              | ${'lts/erbium'}
-      ${'lts/*'}                                   | ${'lts/*'}
-      ${'nodejs 12.3.4'}                           | ${'12.3.4'}
-      ${'ruby 2.3.4\nnodejs 12.3.4\npython 3.4.5'} | ${'12.3.4'}
-      ${''}                                        | ${''}
-      ${'unknown format'}                          | ${'unknown format'}
-      ${'  14.1.0  '}                              | ${'14.1.0'}
-      ${'{"volta": {"node": ">=14.0.0 <=17.0.0"}}'}| ${'>=14.0.0 <=17.0.0'}
-      ${'{"volta": {"extends": "./package.json"}}'}| ${'18.0.0'}
-      ${'{"engines": {"node": "17.0.0"}}'}         | ${'17.0.0'}
-      ${'{}'}                                      | ${null}
-    `.it('parses "$contents"', ({contents, expected}) => {
-      const existsSpy = jest.spyOn(fs, 'existsSync');
-      existsSpy.mockImplementation(() => true);
-
-      const readFileSpy = jest.spyOn(fs, 'readFileSync');
-      readFileSpy.mockImplementation(filePath => {
-        if (
-          typeof filePath === 'string' &&
-          path.basename(filePath) === 'package.json'
-        ) {
-          // Special case for volta.extends
-          return '{"volta": {"node": "18.0.0"}}';
-        }
-
-        return contents;
-      });
-
-      expect(util.getNodeVersionFromFile('file')).toBe(expected);
-    });
-  });
-
   describe('node-version-file flag', () => {
     beforeEach(() => {
       delete inputs['node-version'];
@@ -327,41 +280,4 @@ describe('main tests', () => {
       );
     });
   });
-
-  describe('mirror-url parameter', () => {
-    beforeEach(() => {
-      inputs['mirror-url'] = 'https://custom-mirror-url.com';
-
-      validateMirrorUrlSpy = jest.spyOn(main, 'run');
-      validateMirrorUrlSpy.mockImplementation(() => {});
-    });
-
-    afterEach(() => {
-      validateMirrorUrlSpy.mockRestore();
-    });
-
-    it('Read mirror-url if mirror-url is provided', async () => {
-      // Arrange
-      inputs['mirror-url'] = 'https://custom-mirror-url.com';
-
-      // Act
-      await main.run();
-
-      // Assert
-      expect(inputs['mirror-url']).toBeDefined();
-    });
-
-    it('should throw an error if mirror-url is empty', async () => {
-      // Arrange
-      inputs['mirror-url'] = ' ';
-
-      // Mock log and setFailed
-      const logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); // Mock the log function
-
-      // Act & Assert
-      expect(() => validateMirrorURL(inputs['mirror-url'])).toThrow(
-        'Mirror URL is empty. Please provide a valid mirror URL.'
-      );
-    });
-  });
 });
diff --git a/__tests__/official-installer.test.ts b/__tests__/official-installer.test.ts
index 9f81b9400..274166abf 100644
--- a/__tests__/official-installer.test.ts
+++ b/__tests__/official-installer.test.ts
@@ -831,52 +831,7 @@ describe('setup-node', () => {
     );
   });
   describe('mirror-url parameter', () => {
-    it('Download mirror url if mirror-url is provided', async () => {
-      // Set up test inputs and environment
-      os.platform = 'linux';
-      os.arch = 'x64';
-      inputs['check-latest'] = 'true';
-      const mirrorURL = (inputs['mirror-url'] =
-        'https://custom-mirror-url.com');
-      inputs['token'] = 'faketoken';
-
-      // Mock that the version is not in cache (simulate a fresh download)
-      findSpy.mockImplementation(() => '');
-
-      // Mock implementations for other dependencies
-      const toolPath = path.normalize('/cache/node/11.11.0/x64');
-      exSpy.mockImplementation(async () => '/some/other/temp/path');
-      cacheSpy.mockImplementation(async () => toolPath);
-
-      const dlmirrorSpy = jest.fn(); // Create a spy to track the download logic
-
-      const mockDownloadNodejs = jest
-        .spyOn(OfficialBuilds.prototype as any, 'downloadFromMirrorURL')
-        .mockImplementation(async () => {
-          dlmirrorSpy();
-        });
-
-      // Run the main method or your logic that invokes `downloadFromMirrorURL`
-      await main.run(); // This should internally call `downloadFromMirrorURL`
-
-      // Prepare the expected path after download
-      const expPath = path.join(toolPath, 'bin');
-
-      // Assert that the spy was called, meaning the download logic was triggered
-      expect(dlmirrorSpy).toHaveBeenCalled(); // This verifies that the download occurred
-
-      // Other assertions to verify the flow
-      expect(exSpy).toHaveBeenCalled();
-      expect(logSpy).toHaveBeenCalledWith(
-        `Attempting to download from ${mirrorURL}...`
-      );
-      expect(cnSpy).toHaveBeenCalledWith(`::add-path::${expPath}${osm.EOL}`);
-
-      // Clean up mocks after the test
-      mockDownloadNodejs.mockRestore(); // Ensure to restore the original method after the test
-    });
-
-    it('fallback to default if mirror url is not provided', async () => {
+    it('default if mirror url is not provided', async () => {
       os.platform = 'linux';
       os.arch = 'x64';
 
diff --git a/dist/setup/index.js b/dist/setup/index.js
index e4c17a2ea..796b49d95 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100870,8 +100870,7 @@ function run() {
             if (!arch) {
                 arch = os_1.default.arch();
             }
-            const mirrorurl = core.getInput('mirror-url');
-            const mirrorURL = (0, util_1.validateMirrorURL)(mirrorurl);
+            const mirrorURL = core.getInput('mirror-url');
             if (version) {
                 const token = core.getInput('token');
                 const auth = !token ? undefined : `token ${token}`;
diff --git a/src/main.ts b/src/main.ts
index 8e53606ad..a49427a0e 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -7,11 +7,7 @@ import * as path from 'path';
 import {restoreCache} from './cache-restore';
 import {isCacheFeatureAvailable} from './cache-utils';
 import {getNodejsDistribution} from './distributions/installer-factory';
-import {
-  getNodeVersionFromFile,
-  printEnvDetailsAndSetOutput,
-  validateMirrorURL
-} from './util';
+import {getNodeVersionFromFile, printEnvDetailsAndSetOutput} from './util';
 import {State} from './constants';
 
 export async function run() {
@@ -37,8 +33,7 @@ export async function run() {
       arch = os.arch();
     }
 
-    const mirrorurl = core.getInput('mirror-url');
-    const mirrorURL = validateMirrorURL(mirrorurl);
+    const mirrorURL = core.getInput('mirror-url');
 
     if (version) {
       const token = core.getInput('token');

From a4f5538cea1787b4f4facc6ddac2b5e18efba282 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Thu, 27 Feb 2025 18:33:27 +0530
Subject: [PATCH 09/17] version update from 20.11.0-nightly202312211a0be537da
 to 20.11.0-nightly

---
 .github/workflows/versions.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/versions.yml b/.github/workflows/versions.yml
index f14da4488..cc1b683d8 100644
--- a/.github/workflows/versions.yml
+++ b/.github/workflows/versions.yml
@@ -82,7 +82,7 @@ jobs:
       fail-fast: false
       matrix:
         os: [ubuntu-latest, windows-latest, macos-latest, macos-13]
-        node-version: [20.12.0-nightly, 21-nightly, 18.0.0-nightly]
+        node-version: [20.11.0-nightly, 21-nightly, 18.0.0-nightly]
     steps:
       - uses: actions/checkout@v4
       - name: Setup Node

From 30c33f040941864b3c6218f9d78edc967807ee90 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Thu, 27 Feb 2025 18:39:11 +0530
Subject: [PATCH 10/17] version update to fix check failures

---
 .github/workflows/versions.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/versions.yml b/.github/workflows/versions.yml
index cc1b683d8..b51ba8b52 100644
--- a/.github/workflows/versions.yml
+++ b/.github/workflows/versions.yml
@@ -82,7 +82,7 @@ jobs:
       fail-fast: false
       matrix:
         os: [ubuntu-latest, windows-latest, macos-latest, macos-13]
-        node-version: [20.11.0-nightly, 21-nightly, 18.0.0-nightly]
+        node-version: [20-nightly, 21-nightly, 18.0.0-nightly]
     steps:
       - uses: actions/checkout@v4
       - name: Setup Node

From 5d5d8e9b58a272270ea10eddc95f0b0f9a46b590 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Fri, 28 Feb 2025 16:11:26 +0530
Subject: [PATCH 11/17] code improvements

---
 __tests__/main.test.ts                        | 37 +++++++++++++++++++
 dist/setup/index.js                           | 15 ++++----
 src/distributions/base-distribution.ts        |  7 ++--
 .../official_builds/official_builds.ts        |  8 ++--
 4 files changed, 51 insertions(+), 16 deletions(-)

diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index 501741a6b..3da27e3dc 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -13,6 +13,7 @@ import each from 'jest-each';
 import * as main from '../src/main';
 import * as util from '../src/util';
 import OfficialBuilds from '../src/distributions/official_builds/official_builds';
+import { validateMirrorURL } from '../src/util';
 
 describe('main tests', () => {
   let inputs = {} as any;
@@ -280,4 +281,40 @@ describe('main tests', () => {
       );
     });
   });
+  describe('mirror-url parameter', () => {
+    beforeEach(() => {
+      inputs['mirror-url'] = 'https://custom-mirror-url.com';
+
+      
+    });
+
+    afterEach(() => {
+    delete inputs['mirror-url'];
+    });
+
+    it('Read mirror-url if mirror-url is provided', async () => {
+      // Arrange
+      inputs['mirror-url'] = 'https://custom-mirror-url.com';
+
+      // Act
+      await main.run();
+
+      // Assert
+      expect(inputs['mirror-url']).toBeDefined();
+    });
+
+    it('should throw an error if mirror-url is empty', async () => {
+      // Arrange
+      inputs['mirror-url'] = ' ';
+
+      // Mock log and setFailed
+      const logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); // Mock the log function
+
+      // Act & Assert
+      expect(() => validateMirrorURL(inputs['mirror-url'])).toThrow(
+        'Mirror URL is empty. Please provide a valid mirror URL.'
+      );
+    });
+  });
+
 });
diff --git a/dist/setup/index.js b/dist/setup/index.js
index 796b49d95..afdc69def 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100165,16 +100165,15 @@ class BaseDistribution {
             catch (err) {
                 if (err instanceof Error &&
                     err.message.includes('getaddrinfo EAI_AGAIN')) {
-                    core.error(`Network error: Failed to resolve the server at ${dataUrl}. 
+                    core.setFailed(`Network error: Failed to resolve the server at ${dataUrl}. 
                       Please check your DNS settings or verify that the URL is correct.`);
                 }
                 else if (err instanceof hc.HttpClientError && err.statusCode === 404) {
-                    core.error(`404 Error: Unable to find versions at ${dataUrl}. 
+                    core.setFailed(`404 Error: Unable to find versions at ${dataUrl}. 
                       Please verify that the mirror URL is valid.`);
                 }
                 else {
-                    core.error(`Failed to fetch Node.js versions from ${dataUrl}. 
-                      Please check the URL and try again.}`);
+                    core.setFailed(`Failed to fetch Node.js versions from ${dataUrl}.Please check the URL and try again.}`);
                 }
                 throw err;
             }
@@ -100525,8 +100524,8 @@ class OfficialBuilds extends base_distribution_1.default {
                     }
                 }
                 catch (err) {
-                    core.info(err.message);
-                    core.info('Download failed');
+                    core.setFailed(err.message);
+                    core.setFailed('Download failed');
                     core.debug((_a = err.stack) !== null && _a !== void 0 ? _a : 'empty stack');
                 }
             }
@@ -100726,13 +100725,13 @@ class OfficialBuilds extends base_distribution_1.default {
             }
             catch (error) {
                 if (error instanceof tc.HTTPError && error.httpStatusCode === 404) {
-                    core.error(`Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
+                    core.setFailed(`Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
                         'This usually happens when downloadable binaries are not fully updated at https://nodejs.org/. ' +
                         'To resolve this issue you may either fall back to the older version or try again later.');
                 }
                 else {
                     // For any other error type, you can log the error message.
-                    core.error(`An unexpected error occurred like url might not correct`);
+                    core.setFailed(`An unexpected error occurred like url might not correct`);
                 }
                 throw error;
             }
diff --git a/src/distributions/base-distribution.ts b/src/distributions/base-distribution.ts
index 2235d28aa..ddb86c9be 100644
--- a/src/distributions/base-distribution.ts
+++ b/src/distributions/base-distribution.ts
@@ -116,14 +116,13 @@ export default abstract class BaseDistribution {
         err instanceof Error &&
         err.message.includes('getaddrinfo EAI_AGAIN')
       ) {
-        core.error(`Network error: Failed to resolve the server at ${dataUrl}. 
+        core.setFailed(`Network error: Failed to resolve the server at ${dataUrl}. 
                       Please check your DNS settings or verify that the URL is correct.`);
       } else if (err instanceof hc.HttpClientError && err.statusCode === 404) {
-        core.error(`404 Error: Unable to find versions at ${dataUrl}. 
+        core.setFailed(`404 Error: Unable to find versions at ${dataUrl}. 
                       Please verify that the mirror URL is valid.`);
       } else {
-        core.error(`Failed to fetch Node.js versions from ${dataUrl}. 
-                      Please check the URL and try again.}`);
+        core.setFailed(`Failed to fetch Node.js versions from ${dataUrl}.Please check the URL and try again.}`);
       }
       throw err;
     }
diff --git a/src/distributions/official_builds/official_builds.ts b/src/distributions/official_builds/official_builds.ts
index 3d7a27887..ba8236aa9 100644
--- a/src/distributions/official_builds/official_builds.ts
+++ b/src/distributions/official_builds/official_builds.ts
@@ -26,8 +26,8 @@ export default class OfficialBuilds extends BaseDistribution {
           const toolPath = downloadPath;
         }
       } catch (err) {
-        core.info((err as Error).message);
-        core.info('Download failed');
+        core.setFailed((err as Error).message);
+        core.setFailed('Download failed');
         core.debug((err as Error).stack ?? 'empty stack');
       }
     } else {
@@ -334,14 +334,14 @@ export default class OfficialBuilds extends BaseDistribution {
       return toolPath;
     } catch (error) {
       if (error instanceof tc.HTTPError && error.httpStatusCode === 404) {
-        core.error(
+        core.setFailed(
           `Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
             'This usually happens when downloadable binaries are not fully updated at https://nodejs.org/. ' +
             'To resolve this issue you may either fall back to the older version or try again later.'
         );
       } else {
         // For any other error type, you can log the error message.
-        core.error(`An unexpected error occurred like url might not correct`);
+        core.setFailed(`An unexpected error occurred like url might not correct`);
       }
 
       throw error;

From 87063ef0add0e22b68aefd914b1349a2ab0a94b1 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Fri, 28 Feb 2025 16:16:00 +0530
Subject: [PATCH 12/17] npm run format

---
 __tests__/main.test.ts                             |  7 ++-----
 dist/setup/index.js                                |  6 ++----
 src/distributions/base-distribution.ts             | 14 +++++++++-----
 .../official_builds/official_builds.ts             |  4 +++-
 4 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index 3da27e3dc..15a777c2c 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -13,7 +13,7 @@ import each from 'jest-each';
 import * as main from '../src/main';
 import * as util from '../src/util';
 import OfficialBuilds from '../src/distributions/official_builds/official_builds';
-import { validateMirrorURL } from '../src/util';
+import {validateMirrorURL} from '../src/util';
 
 describe('main tests', () => {
   let inputs = {} as any;
@@ -284,12 +284,10 @@ describe('main tests', () => {
   describe('mirror-url parameter', () => {
     beforeEach(() => {
       inputs['mirror-url'] = 'https://custom-mirror-url.com';
-
-      
     });
 
     afterEach(() => {
-    delete inputs['mirror-url'];
+      delete inputs['mirror-url'];
     });
 
     it('Read mirror-url if mirror-url is provided', async () => {
@@ -316,5 +314,4 @@ describe('main tests', () => {
       );
     });
   });
-
 });
diff --git a/dist/setup/index.js b/dist/setup/index.js
index afdc69def..61c448f18 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100165,12 +100165,10 @@ class BaseDistribution {
             catch (err) {
                 if (err instanceof Error &&
                     err.message.includes('getaddrinfo EAI_AGAIN')) {
-                    core.setFailed(`Network error: Failed to resolve the server at ${dataUrl}. 
-                      Please check your DNS settings or verify that the URL is correct.`);
+                    core.setFailed(`Network error: Failed to resolve the server at ${dataUrl}.Please check your DNS settings or verify that the URL is correct.`);
                 }
                 else if (err instanceof hc.HttpClientError && err.statusCode === 404) {
-                    core.setFailed(`404 Error: Unable to find versions at ${dataUrl}. 
-                      Please verify that the mirror URL is valid.`);
+                    core.setFailed(`404 Error: Unable to find versions at ${dataUrl}.Please verify that the mirror URL is valid.`);
                 }
                 else {
                     core.setFailed(`Failed to fetch Node.js versions from ${dataUrl}.Please check the URL and try again.}`);
diff --git a/src/distributions/base-distribution.ts b/src/distributions/base-distribution.ts
index ddb86c9be..21923ab41 100644
--- a/src/distributions/base-distribution.ts
+++ b/src/distributions/base-distribution.ts
@@ -116,13 +116,17 @@ export default abstract class BaseDistribution {
         err instanceof Error &&
         err.message.includes('getaddrinfo EAI_AGAIN')
       ) {
-        core.setFailed(`Network error: Failed to resolve the server at ${dataUrl}. 
-                      Please check your DNS settings or verify that the URL is correct.`);
+        core.setFailed(
+          `Network error: Failed to resolve the server at ${dataUrl}.Please check your DNS settings or verify that the URL is correct.`
+        );
       } else if (err instanceof hc.HttpClientError && err.statusCode === 404) {
-        core.setFailed(`404 Error: Unable to find versions at ${dataUrl}. 
-                      Please verify that the mirror URL is valid.`);
+        core.setFailed(
+          `404 Error: Unable to find versions at ${dataUrl}.Please verify that the mirror URL is valid.`
+        );
       } else {
-        core.setFailed(`Failed to fetch Node.js versions from ${dataUrl}.Please check the URL and try again.}`);
+        core.setFailed(
+          `Failed to fetch Node.js versions from ${dataUrl}.Please check the URL and try again.}`
+        );
       }
       throw err;
     }
diff --git a/src/distributions/official_builds/official_builds.ts b/src/distributions/official_builds/official_builds.ts
index ba8236aa9..1b5bed5ca 100644
--- a/src/distributions/official_builds/official_builds.ts
+++ b/src/distributions/official_builds/official_builds.ts
@@ -341,7 +341,9 @@ export default class OfficialBuilds extends BaseDistribution {
         );
       } else {
         // For any other error type, you can log the error message.
-        core.setFailed(`An unexpected error occurred like url might not correct`);
+        core.setFailed(
+          `An unexpected error occurred like url might not correct`
+        );
       }
 
       throw error;

From d8619e6d5aba04fe134f4cda9fb329b0392264ff Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Tue, 4 Mar 2025 12:21:43 +0530
Subject: [PATCH 13/17] suppress warnings

---
 dist/setup/index.js                                  | 5 -----
 src/distributions/official_builds/official_builds.ts | 5 -----
 2 files changed, 10 deletions(-)

diff --git a/dist/setup/index.js b/dist/setup/index.js
index 61c448f18..bf340c228 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100516,10 +100516,6 @@ class OfficialBuilds extends base_distribution_1.default {
                 try {
                     core.info(`Attempting to download using mirror URL...`);
                     downloadPath = yield this.downloadFromMirrorURL(); // Attempt to download from the mirror
-                    core.info('downloadPath from downloadFromMirrorURL() ' + downloadPath);
-                    if (downloadPath) {
-                        const toolPath = downloadPath;
-                    }
                 }
                 catch (err) {
                     core.setFailed(err.message);
@@ -100528,7 +100524,6 @@ class OfficialBuilds extends base_distribution_1.default {
                 }
             }
             else {
-                core.info('No mirror URL found. Falling back to default setup...');
                 core.info('Setup Node.js');
                 let manifest;
                 let nodeJsVersions;
diff --git a/src/distributions/official_builds/official_builds.ts b/src/distributions/official_builds/official_builds.ts
index 1b5bed5ca..24db9dd4f 100644
--- a/src/distributions/official_builds/official_builds.ts
+++ b/src/distributions/official_builds/official_builds.ts
@@ -21,17 +21,12 @@ export default class OfficialBuilds extends BaseDistribution {
       try {
         core.info(`Attempting to download using mirror URL...`);
         downloadPath = await this.downloadFromMirrorURL(); // Attempt to download from the mirror
-        core.info('downloadPath from downloadFromMirrorURL() ' + downloadPath);
-        if (downloadPath) {
-          const toolPath = downloadPath;
-        }
       } catch (err) {
         core.setFailed((err as Error).message);
         core.setFailed('Download failed');
         core.debug((err as Error).stack ?? 'empty stack');
       }
     } else {
-      core.info('No mirror URL found. Falling back to default setup...');
       core.info('Setup Node.js');
       let manifest: tc.IToolRelease[] | undefined;
       let nodeJsVersions: INodeVersion[] | undefined;

From 8495358ea6b7d3f10cc811c91d001b210350aaf8 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Tue, 4 Mar 2025 12:50:08 +0530
Subject: [PATCH 14/17] added check-latest

---
 dist/setup/index.js                           | 38 ++++++++++++++++---
 src/distributions/base-distribution.ts        | 14 +++++++
 .../official_builds/official_builds.ts        | 27 ++++++++++---
 3 files changed, 68 insertions(+), 11 deletions(-)

diff --git a/dist/setup/index.js b/dist/setup/index.js
index bf340c228..0dbb269e3 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100124,6 +100124,19 @@ class BaseDistribution {
             return evaluatedVersion;
         });
     }
+    findMirrorVersionInDist(nodeJsVersions) {
+        return __awaiter(this, void 0, void 0, function* () {
+            if (!nodeJsVersions) {
+                nodeJsVersions = yield this.getNodeJsVersions();
+            }
+            const versions = this.filterVersions(nodeJsVersions);
+            const evaluatedVersion = this.evaluateVersions(versions);
+            if (!evaluatedVersion) {
+                throw new Error(`Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch}.`);
+            }
+            return evaluatedVersion;
+        });
+    }
     evaluateVersions(versions) {
         let version = '';
         const { range, options } = this.validRange(this.nodeInfo.versionSpec);
@@ -100705,28 +100718,43 @@ class OfficialBuilds extends base_distribution_1.default {
     }
     downloadFromMirrorURL() {
         return __awaiter(this, void 0, void 0, function* () {
+            // Fetch the available Node.js versions from the mirror
             const nodeJsVersions = yield this.getMirrorUrlVersions();
+            // Filter the available versions based on your criteria
             const versions = this.filterVersions(nodeJsVersions);
-            const evaluatedVersion = this.evaluateVersions(versions);
+            let evaluatedVersion;
+            // If `checkLatest` is set, use the latest version from the mirror
+            if (this.nodeInfo.checkLatest) {
+                evaluatedVersion = yield this.findMirrorVersionInDist(nodeJsVersions);
+                this.nodeInfo.versionSpec = evaluatedVersion; // Update versionSpec to the latest version
+            }
+            else {
+                // Otherwise, evaluate the version from the filtered list
+                evaluatedVersion = this.evaluateVersions(versions);
+            }
+            // If no version is found, throw an error
             if (!evaluatedVersion) {
-                throw new Error(`Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} from the provided mirror-url ${this.nodeInfo.mirrorURL}. Please check the mirror-url`);
+                throw new Error(`Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} from the provided mirror-url ${this.nodeInfo.mirrorURL}. Please check the mirror-url.`);
             }
+            // Get the tool name for downloading
             const toolName = this.getNodejsMirrorURLInfo(evaluatedVersion);
             try {
+                // Try to download the Node.js binaries
                 const toolPath = yield this.downloadNodejs(toolName);
                 return toolPath;
             }
             catch (error) {
+                // Handle specific HTTP error (404 - Not Found)
                 if (error instanceof tc.HTTPError && error.httpStatusCode === 404) {
                     core.setFailed(`Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
                         'This usually happens when downloadable binaries are not fully updated at https://nodejs.org/. ' +
                         'To resolve this issue you may either fall back to the older version or try again later.');
                 }
                 else {
-                    // For any other error type, you can log the error message.
-                    core.setFailed(`An unexpected error occurred like url might not correct`);
+                    // For any other error, log the actual error message
+                    core.setFailed(`An unexpected error occurred:'url might not be correct'}`);
                 }
-                throw error;
+                throw error; // Re-throw the error after logging
             }
         });
     }
diff --git a/src/distributions/base-distribution.ts b/src/distributions/base-distribution.ts
index 21923ab41..0ca1d1da9 100644
--- a/src/distributions/base-distribution.ts
+++ b/src/distributions/base-distribution.ts
@@ -63,6 +63,20 @@ export default abstract class BaseDistribution {
 
     return evaluatedVersion;
   }
+  protected async findMirrorVersionInDist(nodeJsVersions?: INodeVersion[]) {
+    if (!nodeJsVersions) {
+      nodeJsVersions = await this.getNodeJsVersions();
+    }
+    const versions = this.filterVersions(nodeJsVersions);
+    const evaluatedVersion = this.evaluateVersions(versions);
+    if (!evaluatedVersion) {
+      throw new Error(
+        `Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch}.`
+      );
+    }
+
+    return evaluatedVersion;
+  }
 
   protected evaluateVersions(versions: string[]): string {
     let version = '';
diff --git a/src/distributions/official_builds/official_builds.ts b/src/distributions/official_builds/official_builds.ts
index 24db9dd4f..a5bc2195c 100644
--- a/src/distributions/official_builds/official_builds.ts
+++ b/src/distributions/official_builds/official_builds.ts
@@ -310,24 +310,39 @@ export default class OfficialBuilds extends BaseDistribution {
   }
 
   protected async downloadFromMirrorURL() {
+    // Fetch the available Node.js versions from the mirror
     const nodeJsVersions = await this.getMirrorUrlVersions();
+
+    // Filter the available versions based on your criteria
     const versions = this.filterVersions(nodeJsVersions);
 
-    const evaluatedVersion = this.evaluateVersions(versions);
+    let evaluatedVersion;
 
+    // If `checkLatest` is set, use the latest version from the mirror
+    if (this.nodeInfo.checkLatest) {
+      evaluatedVersion = await this.findMirrorVersionInDist(nodeJsVersions);
+      this.nodeInfo.versionSpec = evaluatedVersion; // Update versionSpec to the latest version
+    } else {
+      // Otherwise, evaluate the version from the filtered list
+      evaluatedVersion = this.evaluateVersions(versions);
+    }
+
+    // If no version is found, throw an error
     if (!evaluatedVersion) {
       throw new Error(
-        `Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} from the provided mirror-url ${this.nodeInfo.mirrorURL}. Please check the mirror-url`
+        `Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} from the provided mirror-url ${this.nodeInfo.mirrorURL}. Please check the mirror-url.`
       );
     }
 
+    // Get the tool name for downloading
     const toolName = this.getNodejsMirrorURLInfo(evaluatedVersion);
 
     try {
+      // Try to download the Node.js binaries
       const toolPath = await this.downloadNodejs(toolName);
-
       return toolPath;
     } catch (error) {
+      // Handle specific HTTP error (404 - Not Found)
       if (error instanceof tc.HTTPError && error.httpStatusCode === 404) {
         core.setFailed(
           `Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
@@ -335,13 +350,13 @@ export default class OfficialBuilds extends BaseDistribution {
             'To resolve this issue you may either fall back to the older version or try again later.'
         );
       } else {
-        // For any other error type, you can log the error message.
+        // For any other error, log the actual error message
         core.setFailed(
-          `An unexpected error occurred like url might not correct`
+          `An unexpected error occurred:'url might not be correct'}`
         );
       }
 
-      throw error;
+      throw error; // Re-throw the error after logging
     }
   }
 }

From 8b9906e7bfb160343a7920ad64f0cd72ced9b8c5 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Tue, 4 Mar 2025 13:07:51 +0530
Subject: [PATCH 15/17] update

---
 dist/setup/index.js                           | 38 +++----------------
 src/distributions/base-distribution.ts        | 14 -------
 .../official_builds/official_builds.ts        | 27 +++----------
 3 files changed, 11 insertions(+), 68 deletions(-)

diff --git a/dist/setup/index.js b/dist/setup/index.js
index 0dbb269e3..bf340c228 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100124,19 +100124,6 @@ class BaseDistribution {
             return evaluatedVersion;
         });
     }
-    findMirrorVersionInDist(nodeJsVersions) {
-        return __awaiter(this, void 0, void 0, function* () {
-            if (!nodeJsVersions) {
-                nodeJsVersions = yield this.getNodeJsVersions();
-            }
-            const versions = this.filterVersions(nodeJsVersions);
-            const evaluatedVersion = this.evaluateVersions(versions);
-            if (!evaluatedVersion) {
-                throw new Error(`Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch}.`);
-            }
-            return evaluatedVersion;
-        });
-    }
     evaluateVersions(versions) {
         let version = '';
         const { range, options } = this.validRange(this.nodeInfo.versionSpec);
@@ -100718,43 +100705,28 @@ class OfficialBuilds extends base_distribution_1.default {
     }
     downloadFromMirrorURL() {
         return __awaiter(this, void 0, void 0, function* () {
-            // Fetch the available Node.js versions from the mirror
             const nodeJsVersions = yield this.getMirrorUrlVersions();
-            // Filter the available versions based on your criteria
             const versions = this.filterVersions(nodeJsVersions);
-            let evaluatedVersion;
-            // If `checkLatest` is set, use the latest version from the mirror
-            if (this.nodeInfo.checkLatest) {
-                evaluatedVersion = yield this.findMirrorVersionInDist(nodeJsVersions);
-                this.nodeInfo.versionSpec = evaluatedVersion; // Update versionSpec to the latest version
-            }
-            else {
-                // Otherwise, evaluate the version from the filtered list
-                evaluatedVersion = this.evaluateVersions(versions);
-            }
-            // If no version is found, throw an error
+            const evaluatedVersion = this.evaluateVersions(versions);
             if (!evaluatedVersion) {
-                throw new Error(`Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} from the provided mirror-url ${this.nodeInfo.mirrorURL}. Please check the mirror-url.`);
+                throw new Error(`Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} from the provided mirror-url ${this.nodeInfo.mirrorURL}. Please check the mirror-url`);
             }
-            // Get the tool name for downloading
             const toolName = this.getNodejsMirrorURLInfo(evaluatedVersion);
             try {
-                // Try to download the Node.js binaries
                 const toolPath = yield this.downloadNodejs(toolName);
                 return toolPath;
             }
             catch (error) {
-                // Handle specific HTTP error (404 - Not Found)
                 if (error instanceof tc.HTTPError && error.httpStatusCode === 404) {
                     core.setFailed(`Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
                         'This usually happens when downloadable binaries are not fully updated at https://nodejs.org/. ' +
                         'To resolve this issue you may either fall back to the older version or try again later.');
                 }
                 else {
-                    // For any other error, log the actual error message
-                    core.setFailed(`An unexpected error occurred:'url might not be correct'}`);
+                    // For any other error type, you can log the error message.
+                    core.setFailed(`An unexpected error occurred like url might not correct`);
                 }
-                throw error; // Re-throw the error after logging
+                throw error;
             }
         });
     }
diff --git a/src/distributions/base-distribution.ts b/src/distributions/base-distribution.ts
index 0ca1d1da9..21923ab41 100644
--- a/src/distributions/base-distribution.ts
+++ b/src/distributions/base-distribution.ts
@@ -63,20 +63,6 @@ export default abstract class BaseDistribution {
 
     return evaluatedVersion;
   }
-  protected async findMirrorVersionInDist(nodeJsVersions?: INodeVersion[]) {
-    if (!nodeJsVersions) {
-      nodeJsVersions = await this.getNodeJsVersions();
-    }
-    const versions = this.filterVersions(nodeJsVersions);
-    const evaluatedVersion = this.evaluateVersions(versions);
-    if (!evaluatedVersion) {
-      throw new Error(
-        `Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch}.`
-      );
-    }
-
-    return evaluatedVersion;
-  }
 
   protected evaluateVersions(versions: string[]): string {
     let version = '';
diff --git a/src/distributions/official_builds/official_builds.ts b/src/distributions/official_builds/official_builds.ts
index a5bc2195c..24db9dd4f 100644
--- a/src/distributions/official_builds/official_builds.ts
+++ b/src/distributions/official_builds/official_builds.ts
@@ -310,39 +310,24 @@ export default class OfficialBuilds extends BaseDistribution {
   }
 
   protected async downloadFromMirrorURL() {
-    // Fetch the available Node.js versions from the mirror
     const nodeJsVersions = await this.getMirrorUrlVersions();
-
-    // Filter the available versions based on your criteria
     const versions = this.filterVersions(nodeJsVersions);
 
-    let evaluatedVersion;
-
-    // If `checkLatest` is set, use the latest version from the mirror
-    if (this.nodeInfo.checkLatest) {
-      evaluatedVersion = await this.findMirrorVersionInDist(nodeJsVersions);
-      this.nodeInfo.versionSpec = evaluatedVersion; // Update versionSpec to the latest version
-    } else {
-      // Otherwise, evaluate the version from the filtered list
-      evaluatedVersion = this.evaluateVersions(versions);
-    }
+    const evaluatedVersion = this.evaluateVersions(versions);
 
-    // If no version is found, throw an error
     if (!evaluatedVersion) {
       throw new Error(
-        `Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} from the provided mirror-url ${this.nodeInfo.mirrorURL}. Please check the mirror-url.`
+        `Unable to find Node version '${this.nodeInfo.versionSpec}' for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} from the provided mirror-url ${this.nodeInfo.mirrorURL}. Please check the mirror-url`
       );
     }
 
-    // Get the tool name for downloading
     const toolName = this.getNodejsMirrorURLInfo(evaluatedVersion);
 
     try {
-      // Try to download the Node.js binaries
       const toolPath = await this.downloadNodejs(toolName);
+
       return toolPath;
     } catch (error) {
-      // Handle specific HTTP error (404 - Not Found)
       if (error instanceof tc.HTTPError && error.httpStatusCode === 404) {
         core.setFailed(
           `Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
@@ -350,13 +335,13 @@ export default class OfficialBuilds extends BaseDistribution {
             'To resolve this issue you may either fall back to the older version or try again later.'
         );
       } else {
-        // For any other error, log the actual error message
+        // For any other error type, you can log the error message.
         core.setFailed(
-          `An unexpected error occurred:'url might not be correct'}`
+          `An unexpected error occurred like url might not correct`
         );
       }
 
-      throw error; // Re-throw the error after logging
+      throw error;
     }
   }
 }

From f3381893337bb7cd0d7fef631f22adbced87fce4 Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Tue, 4 Mar 2025 16:31:53 +0530
Subject: [PATCH 16/17] improvements

---
 __tests__/main.test.ts                               |  1 -
 action.yml                                           |  2 +-
 dist/setup/index.js                                  | 12 ++++--------
 src/distributions/official_builds/official_builds.ts |  9 ++-------
 4 files changed, 7 insertions(+), 17 deletions(-)

diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index 15a777c2c..5a3b0f9b7 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -305,7 +305,6 @@ describe('main tests', () => {
       // Arrange
       inputs['mirror-url'] = ' ';
 
-      // Mock log and setFailed
       const logSpy = jest.spyOn(console, 'log').mockImplementation(() => {}); // Mock the log function
 
       // Act & Assert
diff --git a/action.yml b/action.yml
index 45cadd5f1..353028133 100644
--- a/action.yml
+++ b/action.yml
@@ -17,7 +17,7 @@ inputs:
   registry-url:
     description: 'Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, and set up auth to read in from env.NODE_AUTH_TOKEN.'
   mirror-url:
-    description: 'Custom mirror URL to download Node.js from (optional)'
+    description: 'Custom mirror URL to download Node.js'
     required: false
   scope:
     description: 'Optional scope for authenticating against scoped registries. Will fall back to the repository owner when using the GitHub Packages registry (https://npm.pkg.github.com/).'
diff --git a/dist/setup/index.js b/dist/setup/index.js
index bf340c228..6682b6d30 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -100510,17 +100510,14 @@ class OfficialBuilds extends base_distribution_1.default {
     }
     setupNodeJs() {
         return __awaiter(this, void 0, void 0, function* () {
-            var _a, _b;
+            var _a;
             if (this.nodeInfo.mirrorURL) {
-                let downloadPath = '';
                 try {
                     core.info(`Attempting to download using mirror URL...`);
-                    downloadPath = yield this.downloadFromMirrorURL(); // Attempt to download from the mirror
+                    yield this.downloadFromMirrorURL(); // Attempt to download from the mirror
                 }
                 catch (err) {
                     core.setFailed(err.message);
-                    core.setFailed('Download failed');
-                    core.debug((_a = err.stack) !== null && _a !== void 0 ? _a : 'empty stack');
                 }
             }
             else {
@@ -100581,7 +100578,7 @@ class OfficialBuilds extends base_distribution_1.default {
                     else {
                         core.info(err.message);
                     }
-                    core.debug((_b = err.stack) !== null && _b !== void 0 ? _b : 'empty stack');
+                    core.debug((_a = err.stack) !== null && _a !== void 0 ? _a : 'empty stack');
                     core.info('Falling back to download directly from Node');
                 }
                 if (!toolPath) {
@@ -100719,11 +100716,10 @@ class OfficialBuilds extends base_distribution_1.default {
             catch (error) {
                 if (error instanceof tc.HTTPError && error.httpStatusCode === 404) {
                     core.setFailed(`Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
-                        'This usually happens when downloadable binaries are not fully updated at https://nodejs.org/. ' +
+                        'This usually happens when downloadable binaries are not fully updated in the provided mirror-url' +
                         'To resolve this issue you may either fall back to the older version or try again later.');
                 }
                 else {
-                    // For any other error type, you can log the error message.
                     core.setFailed(`An unexpected error occurred like url might not correct`);
                 }
                 throw error;
diff --git a/src/distributions/official_builds/official_builds.ts b/src/distributions/official_builds/official_builds.ts
index 24db9dd4f..fe35bae4d 100644
--- a/src/distributions/official_builds/official_builds.ts
+++ b/src/distributions/official_builds/official_builds.ts
@@ -16,15 +16,11 @@ export default class OfficialBuilds extends BaseDistribution {
 
   public async setupNodeJs() {
     if (this.nodeInfo.mirrorURL) {
-      let downloadPath = '';
-
       try {
         core.info(`Attempting to download using mirror URL...`);
-        downloadPath = await this.downloadFromMirrorURL(); // Attempt to download from the mirror
+        await this.downloadFromMirrorURL(); // Attempt to download from the mirror
       } catch (err) {
         core.setFailed((err as Error).message);
-        core.setFailed('Download failed');
-        core.debug((err as Error).stack ?? 'empty stack');
       }
     } else {
       core.info('Setup Node.js');
@@ -331,11 +327,10 @@ export default class OfficialBuilds extends BaseDistribution {
       if (error instanceof tc.HTTPError && error.httpStatusCode === 404) {
         core.setFailed(
           `Node version ${this.nodeInfo.versionSpec} for platform ${this.osPlat} and architecture ${this.nodeInfo.arch} was found but failed to download. ` +
-            'This usually happens when downloadable binaries are not fully updated at https://nodejs.org/. ' +
+            'This usually happens when downloadable binaries are not fully updated in the provided mirror-url' +
             'To resolve this issue you may either fall back to the older version or try again later.'
         );
       } else {
-        // For any other error type, you can log the error message.
         core.setFailed(
           `An unexpected error occurred like url might not correct`
         );

From e91964252d3c0adcc8c5746fd6c90f8da6997cfe Mon Sep 17 00:00:00 2001
From: Aparna Jyothi <aparnajyothi-y@github.com>
Date: Mon, 10 Mar 2025 18:19:35 +0530
Subject: [PATCH 17/17] Documentation update

---
 .licenses/npm/@actions/cache.dep.yml   |    2 +-
 .licenses/npm/camel-case.dep.yml       |   42 -
 .licenses/npm/commander.dep.yml        |   33 -
 .licenses/npm/dot-object.dep.yml       |   32 -
 .licenses/npm/fs.realpath.dep.yml      |   55 -
 .licenses/npm/glob.dep.yml             |   32 -
 .licenses/npm/inflight.dep.yml         |   26 -
 .licenses/npm/inherits.dep.yml         |   28 -
 .licenses/npm/lodash.dep.yml           |   58 -
 .licenses/npm/lower-case.dep.yml       |   42 -
 .licenses/npm/no-case.dep.yml          |   42 -
 .licenses/npm/pascal-case.dep.yml      |   42 -
 .licenses/npm/path-is-absolute.dep.yml |   34 -
 .licenses/npm/path-to-regexp.dep.yml   |   46 -
 .licenses/npm/prettier.dep.yml         | 3585 ------------------------
 .licenses/npm/ts-poet.dep.yml          |  216 --
 .licenses/npm/twirp-ts.dep.yml         |   11 -
 .licenses/npm/yaml.dep.yml             |   24 -
 README.md                              |   14 +-
 dist/cache-save/index.js               | 2905 +------------------
 dist/setup/index.js                    | 2905 +------------------
 docs/advanced-usage.md                 |   40 +-
 package-lock.json                      |  142 +-
 package.json                           |    2 +-
 24 files changed, 95 insertions(+), 10263 deletions(-)
 delete mode 100644 .licenses/npm/camel-case.dep.yml
 delete mode 100644 .licenses/npm/commander.dep.yml
 delete mode 100644 .licenses/npm/dot-object.dep.yml
 delete mode 100644 .licenses/npm/fs.realpath.dep.yml
 delete mode 100644 .licenses/npm/glob.dep.yml
 delete mode 100644 .licenses/npm/inflight.dep.yml
 delete mode 100644 .licenses/npm/inherits.dep.yml
 delete mode 100644 .licenses/npm/lodash.dep.yml
 delete mode 100644 .licenses/npm/lower-case.dep.yml
 delete mode 100644 .licenses/npm/no-case.dep.yml
 delete mode 100644 .licenses/npm/pascal-case.dep.yml
 delete mode 100644 .licenses/npm/path-is-absolute.dep.yml
 delete mode 100644 .licenses/npm/path-to-regexp.dep.yml
 delete mode 100644 .licenses/npm/prettier.dep.yml
 delete mode 100644 .licenses/npm/ts-poet.dep.yml
 delete mode 100644 .licenses/npm/twirp-ts.dep.yml
 delete mode 100644 .licenses/npm/yaml.dep.yml

diff --git a/.licenses/npm/@actions/cache.dep.yml b/.licenses/npm/@actions/cache.dep.yml
index 6afff4499..6e21be6a2 100644
--- a/.licenses/npm/@actions/cache.dep.yml
+++ b/.licenses/npm/@actions/cache.dep.yml
@@ -1,6 +1,6 @@
 ---
 name: "@actions/cache"
-version: 4.0.0
+version: 4.0.2
 type: npm
 summary: Actions cache lib
 homepage: https://github.com/actions/toolkit/tree/main/packages/cache
diff --git a/.licenses/npm/camel-case.dep.yml b/.licenses/npm/camel-case.dep.yml
deleted file mode 100644
index c143a6a0c..000000000
--- a/.licenses/npm/camel-case.dep.yml
+++ /dev/null
@@ -1,42 +0,0 @@
----
-name: camel-case
-version: 4.1.2
-type: npm
-summary: Transform into a string with the separator denoted by the next word capitalized
-homepage: https://github.com/blakeembrey/change-case/tree/master/packages/camel-case#readme
-license: mit
-licenses:
-- sources: LICENSE
-  text: |
-    The MIT License (MIT)
-
-    Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
-
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-- sources: README.md
-  text: |-
-    MIT
-
-    [npm-image]: https://img.shields.io/npm/v/camel-case.svg?style=flat
-    [npm-url]: https://npmjs.org/package/camel-case
-    [downloads-image]: https://img.shields.io/npm/dm/camel-case.svg?style=flat
-    [downloads-url]: https://npmjs.org/package/camel-case
-    [bundlephobia-image]: https://img.shields.io/bundlephobia/minzip/camel-case.svg
-    [bundlephobia-url]: https://bundlephobia.com/result?p=camel-case
-notices: []
diff --git a/.licenses/npm/commander.dep.yml b/.licenses/npm/commander.dep.yml
deleted file mode 100644
index 7af8a2c32..000000000
--- a/.licenses/npm/commander.dep.yml
+++ /dev/null
@@ -1,33 +0,0 @@
----
-name: commander
-version: 6.2.1
-type: npm
-summary: the complete solution for node.js command-line programs
-homepage:
-license: mit
-licenses:
-- sources: LICENSE
-  text: |
-    (The MIT License)
-
-    Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca>
-
-    Permission is hereby granted, free of charge, to any person obtaining
-    a copy of this software and associated documentation files (the
-    'Software'), to deal in the Software without restriction, including
-    without limitation the rights to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of the Software, and to
-    permit persons to whom the Software is furnished to do so, subject to
-    the following conditions:
-
-    The above copyright notice and this permission notice shall be
-    included in all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-    CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-notices: []
diff --git a/.licenses/npm/dot-object.dep.yml b/.licenses/npm/dot-object.dep.yml
deleted file mode 100644
index 226089bd8..000000000
--- a/.licenses/npm/dot-object.dep.yml
+++ /dev/null
@@ -1,32 +0,0 @@
----
-name: dot-object
-version: 2.1.5
-type: npm
-summary: dot-object makes it possible to transform and read (JSON) objects using dot
-  notation.
-homepage:
-license: mit
-licenses:
-- sources: MIT-LICENSE
-  text: |
-    Copyright (c) 2013 Rob Halff
-
-    Permission is hereby granted, free of charge, to any person obtaining
-    a copy of this software and associated documentation files (the
-    "Software"), to deal in the Software without restriction, including
-    without limitation the rights to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of the Software, and to
-    permit persons to whom the Software is furnished to do so, subject to
-    the following conditions:
-
-    The above copyright notice and this permission notice shall be
-    included in all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-notices: []
diff --git a/.licenses/npm/fs.realpath.dep.yml b/.licenses/npm/fs.realpath.dep.yml
deleted file mode 100644
index 28f5754f4..000000000
--- a/.licenses/npm/fs.realpath.dep.yml
+++ /dev/null
@@ -1,55 +0,0 @@
----
-name: fs.realpath
-version: 1.0.0
-type: npm
-summary: Use node's fs.realpath, but fall back to the JS implementation if the native
-  one fails
-homepage:
-license: isc
-licenses:
-- sources: LICENSE
-  text: |
-    The ISC License
-
-    Copyright (c) Isaac Z. Schlueter and Contributors
-
-    Permission to use, copy, modify, and/or distribute this software for any
-    purpose with or without fee is hereby granted, provided that the above
-    copyright notice and this permission notice appear in all copies.
-
-    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-    MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-    ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-    IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-    ----
-
-    This library bundles a version of the `fs.realpath` and `fs.realpathSync`
-    methods from Node.js v0.10 under the terms of the Node.js MIT license.
-
-    Node's license follows, also included at the header of `old.js` which contains
-    the licensed code:
-
-      Copyright Joyent, Inc. and other Node contributors.
-
-      Permission is hereby granted, free of charge, to any person obtaining a
-      copy of this software and associated documentation files (the "Software"),
-      to deal in the Software without restriction, including without limitation
-      the rights to use, copy, modify, merge, publish, distribute, sublicense,
-      and/or sell copies of the Software, and to permit persons to whom the
-      Software is furnished to do so, subject to the following conditions:
-
-      The above copyright notice and this permission notice shall be included in
-      all copies or substantial portions of the Software.
-
-      THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-      IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-      FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-      AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-      LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-      FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-      DEALINGS IN THE SOFTWARE.
-notices: []
diff --git a/.licenses/npm/glob.dep.yml b/.licenses/npm/glob.dep.yml
deleted file mode 100644
index 915452e51..000000000
--- a/.licenses/npm/glob.dep.yml
+++ /dev/null
@@ -1,32 +0,0 @@
----
-name: glob
-version: 7.2.3
-type: npm
-summary: a little globber
-homepage:
-license: isc
-licenses:
-- sources: LICENSE
-  text: |
-    The ISC License
-
-    Copyright (c) Isaac Z. Schlueter and Contributors
-
-    Permission to use, copy, modify, and/or distribute this software for any
-    purpose with or without fee is hereby granted, provided that the above
-    copyright notice and this permission notice appear in all copies.
-
-    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-    MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-    ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-    IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-    ## Glob Logo
-
-    Glob's logo created by Tanya Brassie <http://tanyabrassie.com/>, licensed
-    under a Creative Commons Attribution-ShareAlike 4.0 International License
-    https://creativecommons.org/licenses/by-sa/4.0/
-notices: []
diff --git a/.licenses/npm/inflight.dep.yml b/.licenses/npm/inflight.dep.yml
deleted file mode 100644
index 30e123e1a..000000000
--- a/.licenses/npm/inflight.dep.yml
+++ /dev/null
@@ -1,26 +0,0 @@
----
-name: inflight
-version: 1.0.6
-type: npm
-summary: Add callbacks to requests in flight to avoid async duplication
-homepage: https://github.com/isaacs/inflight
-license: isc
-licenses:
-- sources: LICENSE
-  text: |
-    The ISC License
-
-    Copyright (c) Isaac Z. Schlueter
-
-    Permission to use, copy, modify, and/or distribute this software for any
-    purpose with or without fee is hereby granted, provided that the above
-    copyright notice and this permission notice appear in all copies.
-
-    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-    MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-    ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-    IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-notices: []
diff --git a/.licenses/npm/inherits.dep.yml b/.licenses/npm/inherits.dep.yml
deleted file mode 100644
index 74179e61f..000000000
--- a/.licenses/npm/inherits.dep.yml
+++ /dev/null
@@ -1,28 +0,0 @@
----
-name: inherits
-version: 2.0.4
-type: npm
-summary: Browser-friendly inheritance fully compatible with standard node.js inherits()
-homepage:
-license: isc
-licenses:
-- sources: LICENSE
-  text: |+
-    The ISC License
-
-    Copyright (c) Isaac Z. Schlueter
-
-    Permission to use, copy, modify, and/or distribute this software for any
-    purpose with or without fee is hereby granted, provided that the above
-    copyright notice and this permission notice appear in all copies.
-
-    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-    FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
-    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
-    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
-    PERFORMANCE OF THIS SOFTWARE.
-
-notices: []
-...
diff --git a/.licenses/npm/lodash.dep.yml b/.licenses/npm/lodash.dep.yml
deleted file mode 100644
index 4314a88a5..000000000
--- a/.licenses/npm/lodash.dep.yml
+++ /dev/null
@@ -1,58 +0,0 @@
----
-name: lodash
-version: 4.17.21
-type: npm
-summary: Lodash modular utilities.
-homepage: https://lodash.com/
-license: mit
-licenses:
-- sources: LICENSE
-  text: |
-    Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
-
-    Based on Underscore.js, copyright Jeremy Ashkenas,
-    DocumentCloud and Investigative Reporters & Editors <http://underscorejs.org/>
-
-    This software consists of voluntary contributions made by many
-    individuals. For exact contribution history, see the revision history
-    available at https://github.com/lodash/lodash
-
-    The following license applies to all parts of this software except as
-    documented below:
-
-    ====
-
-    Permission is hereby granted, free of charge, to any person obtaining
-    a copy of this software and associated documentation files (the
-    "Software"), to deal in the Software without restriction, including
-    without limitation the rights to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of the Software, and to
-    permit persons to whom the Software is furnished to do so, subject to
-    the following conditions:
-
-    The above copyright notice and this permission notice shall be
-    included in all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-    ====
-
-    Copyright and related rights for sample code are waived via CC0. Sample
-    code is defined as all source code displayed within the prose of the
-    documentation.
-
-    CC0: http://creativecommons.org/publicdomain/zero/1.0/
-
-    ====
-
-    Files located in the node_modules and vendor directories are externally
-    maintained libraries used by this software which have their own
-    licenses; we recommend you read them, as their terms may differ from the
-    terms above.
-notices: []
diff --git a/.licenses/npm/lower-case.dep.yml b/.licenses/npm/lower-case.dep.yml
deleted file mode 100644
index e5b04b681..000000000
--- a/.licenses/npm/lower-case.dep.yml
+++ /dev/null
@@ -1,42 +0,0 @@
----
-name: lower-case
-version: 2.0.2
-type: npm
-summary: Transforms the string to lower case
-homepage: https://github.com/blakeembrey/change-case/tree/master/packages/lower-case#readme
-license: mit
-licenses:
-- sources: LICENSE
-  text: |
-    The MIT License (MIT)
-
-    Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
-
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-- sources: README.md
-  text: |-
-    MIT
-
-    [npm-image]: https://img.shields.io/npm/v/lower-case.svg?style=flat
-    [npm-url]: https://npmjs.org/package/lower-case
-    [downloads-image]: https://img.shields.io/npm/dm/lower-case.svg?style=flat
-    [downloads-url]: https://npmjs.org/package/lower-case
-    [bundlephobia-image]: https://img.shields.io/bundlephobia/minzip/lower-case.svg
-    [bundlephobia-url]: https://bundlephobia.com/result?p=lower-case
-notices: []
diff --git a/.licenses/npm/no-case.dep.yml b/.licenses/npm/no-case.dep.yml
deleted file mode 100644
index bee8a3b77..000000000
--- a/.licenses/npm/no-case.dep.yml
+++ /dev/null
@@ -1,42 +0,0 @@
----
-name: no-case
-version: 3.0.4
-type: npm
-summary: Transform into a lower cased string with spaces between words
-homepage: https://github.com/blakeembrey/change-case/tree/master/packages/no-case#readme
-license: mit
-licenses:
-- sources: LICENSE
-  text: |
-    The MIT License (MIT)
-
-    Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
-
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-- sources: README.md
-  text: |-
-    MIT
-
-    [npm-image]: https://img.shields.io/npm/v/no-case.svg?style=flat
-    [npm-url]: https://npmjs.org/package/no-case
-    [downloads-image]: https://img.shields.io/npm/dm/no-case.svg?style=flat
-    [downloads-url]: https://npmjs.org/package/no-case
-    [bundlephobia-image]: https://img.shields.io/bundlephobia/minzip/no-case.svg
-    [bundlephobia-url]: https://bundlephobia.com/result?p=no-case
-notices: []
diff --git a/.licenses/npm/pascal-case.dep.yml b/.licenses/npm/pascal-case.dep.yml
deleted file mode 100644
index 20cd14f63..000000000
--- a/.licenses/npm/pascal-case.dep.yml
+++ /dev/null
@@ -1,42 +0,0 @@
----
-name: pascal-case
-version: 3.1.2
-type: npm
-summary: Transform into a string of capitalized words without separators
-homepage: https://github.com/blakeembrey/change-case/tree/master/packages/pascal-case#readme
-license: mit
-licenses:
-- sources: LICENSE
-  text: |
-    The MIT License (MIT)
-
-    Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
-
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-- sources: README.md
-  text: |-
-    MIT
-
-    [npm-image]: https://img.shields.io/npm/v/pascal-case.svg?style=flat
-    [npm-url]: https://npmjs.org/package/pascal-case
-    [downloads-image]: https://img.shields.io/npm/dm/pascal-case.svg?style=flat
-    [downloads-url]: https://npmjs.org/package/pascal-case
-    [bundlephobia-image]: https://img.shields.io/bundlephobia/minzip/pascal-case.svg
-    [bundlephobia-url]: https://bundlephobia.com/result?p=pascal-case
-notices: []
diff --git a/.licenses/npm/path-is-absolute.dep.yml b/.licenses/npm/path-is-absolute.dep.yml
deleted file mode 100644
index d8fbfdd1b..000000000
--- a/.licenses/npm/path-is-absolute.dep.yml
+++ /dev/null
@@ -1,34 +0,0 @@
----
-name: path-is-absolute
-version: 1.0.1
-type: npm
-summary: Node.js 0.12 path.isAbsolute() ponyfill
-homepage:
-license: mit
-licenses:
-- sources: license
-  text: |
-    The MIT License (MIT)
-
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
-
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-- sources: readme.md
-  text: MIT © [Sindre Sorhus](https://sindresorhus.com)
-notices: []
diff --git a/.licenses/npm/path-to-regexp.dep.yml b/.licenses/npm/path-to-regexp.dep.yml
deleted file mode 100644
index 03207b9b4..000000000
--- a/.licenses/npm/path-to-regexp.dep.yml
+++ /dev/null
@@ -1,46 +0,0 @@
----
-name: path-to-regexp
-version: 6.3.0
-type: npm
-summary: Express style path to RegExp utility
-homepage:
-license: mit
-licenses:
-- sources: LICENSE
-  text: |
-    The MIT License (MIT)
-
-    Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
-
-    Permission is hereby granted, free of charge, to any person obtaining a copy
-    of this software and associated documentation files (the "Software"), to deal
-    in the Software without restriction, including without limitation the rights
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-    copies of the Software, and to permit persons to whom the Software is
-    furnished to do so, subject to the following conditions:
-
-    The above copyright notice and this permission notice shall be included in
-    all copies or substantial portions of the Software.
-
-    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-    THE SOFTWARE.
-- sources: Readme.md
-  text: |-
-    MIT
-
-    [npm-image]: https://img.shields.io/npm/v/path-to-regexp
-    [npm-url]: https://npmjs.org/package/path-to-regexp
-    [downloads-image]: https://img.shields.io/npm/dm/path-to-regexp
-    [downloads-url]: https://npmjs.org/package/path-to-regexp
-    [build-image]: https://img.shields.io/github/actions/workflow/status/pillarjs/path-to-regexp/ci.yml?branch=master
-    [build-url]: https://github.com/pillarjs/path-to-regexp/actions/workflows/ci.yml?query=branch%3Amaster
-    [coverage-image]: https://img.shields.io/codecov/c/gh/pillarjs/path-to-regexp
-    [coverage-url]: https://codecov.io/gh/pillarjs/path-to-regexp
-    [license-image]: http://img.shields.io/npm/l/path-to-regexp.svg?style=flat
-    [license-url]: LICENSE.md
-notices: []
diff --git a/.licenses/npm/prettier.dep.yml b/.licenses/npm/prettier.dep.yml
deleted file mode 100644
index 1cfcfec8b..000000000
--- a/.licenses/npm/prettier.dep.yml
+++ /dev/null
@@ -1,3585 +0,0 @@
----
-name: prettier
-version: 2.8.8
-type: npm
-summary: Prettier is an opinionated code formatter
-homepage: https://prettier.io
-license: mit
-licenses:
-- sources: LICENSE
-  text: "# Prettier license\n\nPrettier is released under the MIT license:\n\nCopyright
-    © James Long and contributors\n\nPermission is hereby granted, free of charge,
-    to any person obtaining a copy of this software and associated documentation files
-    (the \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n\nThe above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n## Licenses of bundled dependencies\n\nThe published Prettier artifact
-    additionally contains code with the following licenses:\nMIT, ISC, BSD-2-Clause,
-    BSD-3-Clause, Apache-2.0, 0BSD\n\n## Bundled dependencies\n\n### @angular/compiler@v12.2.16\n\nLicense:
-    MIT\nBy: angular\nRepository: <https://github.com/angular/angular.git>\n\n----------------------------------------\n\n###
-    @babel/code-frame@v7.18.6\n\nLicense: MIT\nBy: The Babel Team\nRepository: <https://github.com/babel/babel.git>\n\n>
-    MIT License\n>\n> Copyright (c) 2014-present Sebastian McKenzie and other contributors\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining\n> a copy
-    of this software and associated documentation files (the\n> \"Software\"), to
-    deal in the Software without restriction, including\n> without limitation the
-    rights to use, copy, modify, merge, publish,\n> distribute, sublicense, and/or
-    sell copies of the Software, and to\n> permit persons to whom the Software is
-    furnished to do so, subject to\n> the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be\n> included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-    OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT.
-    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n> LIABLE FOR ANY CLAIM,
-    DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n> OF CONTRACT, TORT OR OTHERWISE,
-    ARISING FROM, OUT OF OR IN CONNECTION\n> WITH THE SOFTWARE OR THE USE OR OTHER
-    DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n### @babel/helper-validator-identifier@v7.19.1\n\nLicense:
-    MIT\nBy: The Babel Team\nRepository: <https://github.com/babel/babel.git>\n\n>
-    MIT License\n>\n> Copyright (c) 2014-present Sebastian McKenzie and other contributors\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining\n> a copy
-    of this software and associated documentation files (the\n> \"Software\"), to
-    deal in the Software without restriction, including\n> without limitation the
-    rights to use, copy, modify, merge, publish,\n> distribute, sublicense, and/or
-    sell copies of the Software, and to\n> permit persons to whom the Software is
-    furnished to do so, subject to\n> the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be\n> included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-    OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT.
-    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n> LIABLE FOR ANY CLAIM,
-    DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n> OF CONTRACT, TORT OR OTHERWISE,
-    ARISING FROM, OUT OF OR IN CONNECTION\n> WITH THE SOFTWARE OR THE USE OR OTHER
-    DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n### @babel/highlight@v7.18.6\n\nLicense:
-    MIT\nBy: The Babel Team\nRepository: <https://github.com/babel/babel.git>\n\n>
-    MIT License\n>\n> Copyright (c) 2014-present Sebastian McKenzie and other contributors\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining\n> a copy
-    of this software and associated documentation files (the\n> \"Software\"), to
-    deal in the Software without restriction, including\n> without limitation the
-    rights to use, copy, modify, merge, publish,\n> distribute, sublicense, and/or
-    sell copies of the Software, and to\n> permit persons to whom the Software is
-    furnished to do so, subject to\n> the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be\n> included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-    OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT.
-    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n> LIABLE FOR ANY CLAIM,
-    DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n> OF CONTRACT, TORT OR OTHERWISE,
-    ARISING FROM, OUT OF OR IN CONNECTION\n> WITH THE SOFTWARE OR THE USE OR OTHER
-    DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n### @babel/parser@v7.21.3\n\nLicense:
-    MIT\nBy: The Babel Team\nRepository: <https://github.com/babel/babel.git>\n\n>
-    Copyright (C) 2012-2014 by various contributors (see AUTHORS)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    @glimmer/env@v0.1.7\n\nLicense: MIT\n\n> Copyright (c) 2017 Martin Muñoz and contributors.\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of\n>
-    this software and associated documentation files (the \"Software\"), to deal in\n>
-    the Software without restriction, including without limitation the rights to\n>
-    use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n>
-    of the Software, and to permit persons to whom the Software is furnished to do\n>
-    so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in all\n> copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n### @glimmer/syntax@v0.84.2\n\nLicense:
-    MIT\n\n> Copyright (c) 2015 Tilde, Inc.\n>\n> Permission is hereby granted, free
-    of charge, to any person obtaining a copy of\n> this software and associated documentation
-    files (the \"Software\"), to deal in\n> the Software without restriction, including
-    without limitation the rights to\n> use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell copies\n> of the Software, and to permit persons to whom
-    the Software is furnished to do\n> so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    @glimmer/util@v0.84.2\n\nLicense: MIT\n\n> Copyright (c) 2015 Tilde, Inc.\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of\n>
-    this software and associated documentation files (the \"Software\"), to deal in\n>
-    the Software without restriction, including without limitation the rights to\n>
-    use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n>
-    of the Software, and to permit persons to whom the Software is furnished to do\n>
-    so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in all\n> copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n### @handlebars/parser@v2.0.0\n\nLicense:
-    ISC\nRepository: <git+https://github.com/handlebars-lang/handlebars-parser.git>\n\n----------------------------------------\n\n###
-    @iarna/toml@v2.2.5\n\nLicense: ISC\nBy: Rebecca Turner\nRepository: <git+https://github.com/iarna/iarna-toml.git>\n\n>
-    Copyright (c) 2016, Rebecca Turner <me@re-becca.org>\n>\n> Permission to use,
-    copy, modify, and/or distribute this software for any\n> purpose with or without
-    fee is hereby granted, provided that the above\n> copyright notice and this permission
-    notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\" AND THE
-    AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE INCLUDING ALL
-    IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
-    BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
-    DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
-    AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n>
-    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    @nodelib/fs.scandir@v2.1.5\n\nLicense: MIT\n\n> The MIT License (MIT)\n>\n> Copyright
-    (c) Denis Malinochkin\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy\n> of this software and associated documentation files
-    (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    @nodelib/fs.stat@v2.0.5\n\nLicense: MIT\n\n> The MIT License (MIT)\n>\n> Copyright
-    (c) Denis Malinochkin\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy\n> of this software and associated documentation files
-    (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    @nodelib/fs.walk@v1.2.8\n\nLicense: MIT\n\n> The MIT License (MIT)\n>\n> Copyright
-    (c) Denis Malinochkin\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy\n> of this software and associated documentation files
-    (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    @typescript-eslint/types@v5.55.0\n\nLicense: MIT\nRepository: <https://github.com/typescript-eslint/typescript-eslint.git>\n\n>
-    MIT License\n>\n> Copyright (c) 2019 typescript-eslint and other contributors\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy\n>
-    of this software and associated documentation files (the \"Software\"), to deal\n>
-    in the Software without restriction, including without limitation the rights\n>
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies
-    of the Software, and to permit persons to whom the Software is\n> furnished to
-    do so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in all\n> copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n### @typescript-eslint/typescript-estree@v5.55.0\n\nLicense:
-    BSD-2-Clause\nRepository: <https://github.com/typescript-eslint/typescript-eslint.git>\n\n>
-    TypeScript ESTree\n>\n> Originally extracted from:\n>\n> TypeScript ESLint Parser\n>
-    Copyright JS Foundation and other contributors, https://js.foundation\n>\n> Redistribution
-    and use in source and binary forms, with or without\n> modification, are permitted
-    provided that the following conditions are met:\n>\n> - Redistributions of source
-    code must retain the above copyright\n>   notice, this list of conditions and
-    the following disclaimer.\n> - Redistributions in binary form must reproduce the
-    above copyright\n>   notice, this list of conditions and the following disclaimer
-    in the\n>   documentation and/or other materials provided with the distribution.\n>\n>
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n>
-    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n> IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n> ARE DISCLAIMED.
-    IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n> DIRECT, INDIRECT, INCIDENTAL,
-    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n> (INCLUDING, BUT NOT LIMITED TO,
-    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n> LOSS OF USE, DATA, OR PROFITS;
-    OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n> ON ANY THEORY OF LIABILITY, WHETHER
-    IN CONTRACT, STRICT LIABILITY, OR TORT\n> (INCLUDING NEGLIGENCE OR OTHERWISE)
-    ARISING IN ANY WAY OUT OF THE USE OF\n> THIS SOFTWARE, EVEN IF ADVISED OF THE
-    POSSIBILITY OF SUCH DAMAGE.\n\n----------------------------------------\n\n###
-    @typescript-eslint/visitor-keys@v5.55.0\n\nLicense: MIT\nRepository: <https://github.com/typescript-eslint/typescript-eslint.git>\n\n>
-    MIT License\n>\n> Copyright (c) 2019 typescript-eslint and other contributors\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy\n>
-    of this software and associated documentation files (the \"Software\"), to deal\n>
-    in the Software without restriction, including without limitation the rights\n>
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies
-    of the Software, and to permit persons to whom the Software is\n> furnished to
-    do so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in all\n> copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n### acorn@v8.8.1\n\nLicense:
-    MIT\nRepository: <https://github.com/acornjs/acorn.git>\n\n> MIT License\n>\n>
-    Copyright (C) 2012-2022 by various contributors (see AUTHORS)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    acorn-jsx@v5.3.2\n\nLicense: MIT\nRepository: <https://github.com/acornjs/acorn-jsx>\n\n>
-    Copyright (C) 2012-2017 by Ingvar Stepanyan\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy\n> of this software and associated
-    documentation files (the \"Software\"), to deal\n> in the Software without restriction,
-    including without limitation the rights\n> to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons
-    to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    aggregate-error@v3.1.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    angular-estree-parser@v2.5.1\n\nLicense: MIT\nBy: Ika\n\n> MIT License\n>\n> Copyright
-    (c) Ika <ikatyang@gmail.com> (https://github.com/ikatyang)\n>\n> Permission is
-    hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    angular-html-parser@v1.8.0\n\nLicense: MIT\nBy: Ika\n\n> MIT License\n>\n> Copyright
-    (c) Ika <ikatyang@gmail.com> (https://github.com/ikatyang)\n>\n> Permission is
-    hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    ansi-regex@v6.0.1\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    ansi-styles@v3.2.1\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    array-union@v2.1.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    bail@v1.0.5\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n> Copyright
-    (c) 2015 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining\n> a copy of this software and associated
-    documentation files (the\n> 'Software'), to deal in the Software without restriction,
-    including\n> without limitation the rights to use, copy, modify, merge, publish,\n>
-    distribute, sublicense, and/or sell copies of the Software, and to\n> permit persons
-    to whom the Software is furnished to do so, subject to\n> the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be\n> included in
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT
-    LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-    LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n>
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n> SOFTWARE
-    OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    balanced-match@v1.0.2\n\nLicense: MIT\nBy: Julian Gruber\nRepository: <git://github.com/juliangruber/balanced-match.git>\n\n>
-    (MIT)\n>\n> Copyright (c) 2013 Julian Gruber &lt;julian@juliangruber.com&gt;\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of\n>
-    this software and associated documentation files (the \"Software\"), to deal in\n>
-    the Software without restriction, including without limitation the rights to\n>
-    use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n>
-    of the Software, and to permit persons to whom the Software is furnished to do\n>
-    so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in all\n> copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n### brace-expansion@v1.1.11\n\nLicense:
-    MIT\nBy: Julian Gruber\nRepository: <git://github.com/juliangruber/brace-expansion.git>\n\n>
-    MIT License\n>\n> Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy\n>
-    of this software and associated documentation files (the \"Software\"), to deal\n>
-    in the Software without restriction, including without limitation the rights\n>
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies
-    of the Software, and to permit persons to whom the Software is\n> furnished to
-    do so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in all\n> copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n### braces@v3.0.2\n\nLicense:
-    MIT\nBy: Jon Schlinkert\n\n> The MIT License (MIT)\n>\n> Copyright (c) 2014-2018,
-    Jon Schlinkert.\n>\n> Permission is hereby granted, free of charge, to any person
-    obtaining a copy\n> of this software and associated documentation files (the \"Software\"),
-    to deal\n> in the Software without restriction, including without limitation the
-    rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or
-    sell\n> copies of the Software, and to permit persons to whom the Software is\n>
-    furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in\n> all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-    OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-    NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n### camelcase@v6.3.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (https://sindresorhus.com)\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining a copy of this software and associated documentation files
-    (the \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### ccount@v1.1.0\n\nLicense:
-    MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n> Copyright (c) 2015 Titus Wormer
-    <tituswormer@gmail.com>\n>\n> Permission is hereby granted, free of charge, to
-    any person obtaining\n> a copy of this software and associated documentation files
-    (the\n> 'Software'), to deal in the Software without restriction, including\n>
-    without limitation the rights to use, copy, modify, merge, publish,\n> distribute,
-    sublicense, and/or sell copies of the Software, and to\n> permit persons to whom
-    the Software is furnished to do so, subject to\n> the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be\n> included in
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT
-    LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-    LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n>
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n> SOFTWARE
-    OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    chalk@v2.4.2\n\nLicense: MIT\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus
-    <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy of this software and associated
-    documentation files (the \"Software\"), to deal in the Software without restriction,
-    including without limitation the rights to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of the Software, and to permit persons
-    to whom the Software is furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-    LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-    FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
-    OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
-    OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    chalk@v5.0.1\n\nLicense: MIT\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus
-    <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy of this software and associated
-    documentation files (the \"Software\"), to deal in the Software without restriction,
-    including without limitation the rights to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of the Software, and to permit persons
-    to whom the Software is furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-    LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-    FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
-    OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
-    OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    character-entities@v1.2.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    character-entities-legacy@v1.1.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT
-    License)\n>\n> Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining\n> a copy of this software
-    and associated documentation files (the\n> 'Software'), to deal in the Software
-    without restriction, including\n> without limitation the rights to use, copy,
-    modify, merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    character-reference-invalid@v1.1.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The
-    MIT License)\n>\n> Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining\n> a copy
-    of this software and associated documentation files (the\n> 'Software'), to deal
-    in the Software without restriction, including\n> without limitation the rights
-    to use, copy, modify, merge, publish,\n> distribute, sublicense, and/or sell copies
-    of the Software, and to\n> permit persons to whom the Software is furnished to
-    do so, subject to\n> the following conditions:\n>\n> The above copyright notice
-    and this permission notice shall be\n> included in all copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY
-    KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n>
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO
-    EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES
-    OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING
-    FROM, OUT OF OR IN CONNECTION WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE SOFTWARE.\n\n----------------------------------------\n\n### ci-info@v3.3.0\n\nLicense:
-    MIT\nBy: Thomas Watson Steen\nRepository: <https://github.com/watson/ci-info.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2016-2021 Thomas Watson Steen\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy\n>
-    of this software and associated documentation files (the \"Software\"), to deal\n>
-    in the Software without restriction, including without limitation the rights\n>
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies
-    of the Software, and to permit persons to whom the Software is\n> furnished to
-    do so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in all\n> copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n### clean-stack@v2.2.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (sindresorhus.com)\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy of this software and associated documentation files (the
-    \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### clone@v1.0.4\n\nLicense:
-    MIT\nBy: Paul Vorbach\nRepository: <git://github.com/pvorb/node-clone.git>\n\n>
-    Copyright © 2011-2015 Paul Vorbach <paul@vorba.ch>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy of\n> this software and
-    associated documentation files (the “Software”), to deal in\n> the Software without
-    restriction, including without limitation the rights to\n> use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of\n> the Software,
-    and to permit persons to whom the Software is furnished to do so,\n> subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n>
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n>
-    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n>
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, OUT OF OR IN CONNECTION WITH THE\n>
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    collapse-white-space@v1.0.6\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    color-convert@v1.9.3\n\nLicense: MIT\nBy: Heather Arthur\n\n> Copyright (c) 2011-2016
-    Heather Arthur <fayearthur@gmail.com>\n>\n> Permission is hereby granted, free
-    of charge, to any person obtaining\n> a copy of this software and associated documentation
-    files (the\n> \"Software\"), to deal in the Software without restriction, including\n>
-    without limitation the rights to use, copy, modify, merge, publish,\n> distribute,
-    sublicense, and/or sell copies of the Software, and to\n> permit persons to whom
-    the Software is furnished to do so, subject to\n> the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be\n> included in
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND\n> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE\n> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n>
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n> WITH
-    THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    color-name@v1.1.3\n\nLicense: MIT\nBy: DY\nRepository: <git@github.com:dfcreative/color-name.git>\n\n>
-    The MIT License (MIT)\n> Copyright (c) 2015 Dmitry Ivanov\n> \n> Permission is
-    hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n> \n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n> \n> THE
-    SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    commondir@v1.0.1\n\nLicense: MIT\nBy: James Halliday\nRepository: <http://github.com/substack/node-commondir.git>\n\n>
-    The MIT License\n>\n> Copyright (c) 2013 James Halliday (mail@substack.net)\n>\n>
-    Permission is hereby granted, free of charge, \n> to any person obtaining a copy
-    of this software and \n> associated documentation files (the \"Software\"), to
-    \n> deal in the Software without restriction, including \n> without limitation
-    the rights to use, copy, modify, \n> merge, publish, distribute, sublicense, and/or
-    sell \n> copies of the Software, and to permit persons to whom \n> the Software
-    is furnished to do so, \n> subject to the following conditions:\n>\n> The above
-    copyright notice and this permission notice \n> shall be included in all copies
-    or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\",
-    WITHOUT WARRANTY OF ANY KIND, \n> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
-    TO THE WARRANTIES \n> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-    NONINFRINGEMENT. \n> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-    FOR \n> ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    \n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE \n> SOFTWARE
-    OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    concat-map@v0.0.1\n\nLicense: MIT\nBy: James Halliday\nRepository: <git://github.com/substack/node-concat-map.git>\n\n>
-    This software is released under the MIT license:\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy of\n> this software and associated
-    documentation files (the \"Software\"), to deal in\n> the Software without restriction,
-    including without limitation the rights to\n> use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of\n> the Software, and to permit persons
-    to whom the Software is furnished to do so,\n> subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n> FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n> COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n> IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n> CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    cosmiconfig@v7.0.1\n\nLicense: MIT\nBy: David Clark\nRepository: <git+https://github.com/davidtheclark/cosmiconfig.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2015 David Clark\n>\n> Permission is
-    hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    cross-spawn@v7.0.3\n\nLicense: MIT\nBy: André Cruz\nRepository: <git@github.com:moxystudio/node-cross-spawn.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2018 Made With MOXY Lda <hello@moxy.studio>\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy\n>
-    of this software and associated documentation files (the \"Software\"), to deal\n>
-    in the Software without restriction, including without limitation the rights\n>
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies
-    of the Software, and to permit persons to whom the Software is\n> furnished to
-    do so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in\n> all copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n### crypto-random-string@v4.0.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (https://sindresorhus.com)\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining a copy of this software and associated documentation files
-    (the \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### css-units-list@v1.1.0\n\nLicense:
-    MIT\nBy: fisker Cheung\n\n> MIT License\n>\n> Copyright (c) fisker Cheung <lionkay@gmail.com>
-    (https://www.fiskercheung.com/)\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining a copy\n> of this software and associated documentation
-    files (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    dashify@v2.0.0\n\nLicense: MIT\nBy: Jon Schlinkert\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2015-present, Jon Schlinkert.\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy\n> of this software and associated
-    documentation files (the \"Software\"), to deal\n> in the Software without restriction,
-    including without limitation the rights\n> to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons
-    to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    defaults@v1.0.4\n\nLicense: MIT\nBy: Elijah Insua\nRepository: <git://github.com/sindresorhus/node-defaults.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2022 Sindre Sorhus\n> Copyright (c)
-    2015 Elijah Insua\n>\n> Permission is hereby granted, free of charge, to any person
-    obtaining a copy\n> of this software and associated documentation files (the \"Software\"),
-    to deal\n> in the Software without restriction, including without limitation the
-    rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or
-    sell\n> copies of the Software, and to permit persons to whom the Software is\n>
-    furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in\n> all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-    OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-    NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n### del@v6.1.1\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (https://sindresorhus.com)\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining a copy of this software and associated documentation files
-    (the \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### detect-newline@v3.1.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (sindresorhus.com)\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy of this software and associated documentation files (the
-    \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### diff@v5.0.0\n\nLicense:
-    BSD-3-Clause\nRepository: <git://github.com/kpdecker/jsdiff.git>\n\n> Software
-    License Agreement (BSD License)\n>\n> Copyright (c) 2009-2015, Kevin Decker <kpdecker@gmail.com>\n>\n>
-    All rights reserved.\n>\n> Redistribution and use of this software in source and
-    binary forms, with or without modification,\n> are permitted provided that the
-    following conditions are met:\n>\n> * Redistributions of source code must retain
-    the above\n>   copyright notice, this list of conditions and the\n>   following
-    disclaimer.\n>\n> * Redistributions in binary form must reproduce the above\n>
-    \  copyright notice, this list of conditions and the\n>   following disclaimer
-    in the documentation and/or other\n>   materials provided with the distribution.\n>\n>
-    * Neither the name of Kevin Decker nor the names of its\n>   contributors may
-    be used to endorse or promote products\n>   derived from this software without
-    specific prior\n>   written permission.\n>\n> THIS SOFTWARE IS PROVIDED BY THE
-    COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR\n> IMPLIED WARRANTIES,
-    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND\n>
-    FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-    OWNER OR\n> CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-    EXEMPLARY, OR CONSEQUENTIAL\n> DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
-    OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n> DATA, OR PROFITS; OR BUSINESS
-    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER\n> IN CONTRACT,
-    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-    OUT\n> OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-    DAMAGE.\n\n----------------------------------------\n\n### dir-glob@v3.0.1\n\nLicense:
-    MIT\nBy: Kevin Mårtensson\n\n> MIT License\n>\n> Copyright (c) Kevin Mårtensson
-    <kevinmartensson@gmail.com> (github.com/kevva)\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy of this software and associated
-    documentation files (the \"Software\"), to deal in the Software without restriction,
-    including without limitation the rights to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of the Software, and to permit persons
-    to whom the Software is furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
-    LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-    FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
-    OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
-    OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    editorconfig@v0.15.3\n\nLicense: MIT\nBy: EditorConfig Team\nRepository: <git://github.com/editorconfig/editorconfig-core-js.git>\n\n>
-    Copyright © 2012 EditorConfig Team\n>\n> Permission is hereby granted, free of
-    charge, to any person obtaining a copy\n> of this software and associated documentation
-    files (the “Software”), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT
-    LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE
-    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE
-    OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    editorconfig-to-prettier@v1.0.0\n\nLicense: ISC\nBy: Joseph Frazier\nRepository:
-    <git+https://github.com/josephfrazier/editorconfig-to-prettier.git>\n\n----------------------------------------\n\n###
-    emoji-regex@v9.2.2\n\nLicense: MIT\nBy: Mathias Bynens\nRepository: <https://github.com/mathiasbynens/emoji-regex.git>\n\n>
-    Copyright Mathias Bynens <https://mathiasbynens.be/>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> \"Software\"), to deal in the Software
-    without restriction, including\n> without limitation the rights to use, copy,
-    modify, merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE\n> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION\n> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n>
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    error-ex@v1.3.2\n\nLicense: MIT\n\n> The MIT License (MIT)\n>\n> Copyright (c)
-    2015 JD Ballard\n>\n> Permission is hereby granted, free of charge, to any person
-    obtaining a copy\n> of this software and associated documentation files (the \"Software\"),
-    to deal\n> in the Software without restriction, including without limitation the
-    rights\n> to use, copy, modify, merge, publish, distribute, sublicense, and/or
-    sell\n> copies of the Software, and to permit persons to whom the Software is\n>
-    furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in\n> all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-    OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-    NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n### escape-string-regexp@v1.0.5\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> The MIT License (MIT)\n>\n> Copyright (c) Sindre Sorhus
-    <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy\n> of this software and associated
-    documentation files (the \"Software\"), to deal\n> in the Software without restriction,
-    including without limitation the rights\n> to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons
-    to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    escape-string-regexp@v5.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    eslint-visitor-keys@v3.3.0\n\nLicense: Apache-2.0\nBy: Toru Nagashima\n\n> Apache
-    License\n>                            Version 2.0, January 2004\n>                         http://www.apache.org/licenses/\n>\n>
-    \   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n>\n>    1. Definitions.\n>\n>
-    \      \"License\" shall mean the terms and conditions for use, reproduction,\n>
-    \      and distribution as defined by Sections 1 through 9 of this document.\n>\n>
-    \      \"Licensor\" shall mean the copyright owner or entity authorized by\n>
-    \      the copyright owner that is granting the License.\n>\n>       \"Legal Entity\"
-    shall mean the union of the acting entity and all\n>       other entities that
-    control, are controlled by, or are under common\n>       control with that entity.
-    For the purposes of this definition,\n>       \"control\" means (i) the power,
-    direct or indirect, to cause the\n>       direction or management of such entity,
-    whether by contract or\n>       otherwise, or (ii) ownership of fifty percent
-    (50%) or more of the\n>       outstanding shares, or (iii) beneficial ownership
-    of such entity.\n>\n>       \"You\" (or \"Your\") shall mean an individual or
-    Legal Entity\n>       exercising permissions granted by this License.\n>\n>       \"Source\"
-    form shall mean the preferred form for making modifications,\n>       including
-    but not limited to software source code, documentation\n>       source, and configuration
-    files.\n>\n>       \"Object\" form shall mean any form resulting from mechanical\n>
-    \      transformation or translation of a Source form, including but\n>       not
-    limited to compiled object code, generated documentation,\n>       and conversions
-    to other media types.\n>\n>       \"Work\" shall mean the work of authorship,
-    whether in Source or\n>       Object form, made available under the License, as
-    indicated by a\n>       copyright notice that is included in or attached to the
-    work\n>       (an example is provided in the Appendix below).\n>\n>       \"Derivative
-    Works\" shall mean any work, whether in Source or Object\n>       form, that is
-    based on (or derived from) the Work and for which the\n>       editorial revisions,
-    annotations, elaborations, or other modifications\n>       represent, as a whole,
-    an original work of authorship. For the purposes\n>       of this License, Derivative
-    Works shall not include works that remain\n>       separable from, or merely link
-    (or bind by name) to the interfaces of,\n>       the Work and Derivative Works
-    thereof.\n>\n>       \"Contribution\" shall mean any work of authorship, including\n>
-    \      the original version of the Work and any modifications or additions\n>
-    \      to that Work or Derivative Works thereof, that is intentionally\n>       submitted
-    to Licensor for inclusion in the Work by the copyright owner\n>       or by an
-    individual or Legal Entity authorized to submit on behalf of\n>       the copyright
-    owner. For the purposes of this definition, \"submitted\"\n>       means any form
-    of electronic, verbal, or written communication sent\n>       to the Licensor
-    or its representatives, including but not limited to\n>       communication on
-    electronic mailing lists, source code control systems,\n>       and issue tracking
-    systems that are managed by, or on behalf of, the\n>       Licensor for the purpose
-    of discussing and improving the Work, but\n>       excluding communication that
-    is conspicuously marked or otherwise\n>       designated in writing by the copyright
-    owner as \"Not a Contribution.\"\n>\n>       \"Contributor\" shall mean Licensor
-    and any individual or Legal Entity\n>       on behalf of whom a Contribution has
-    been received by Licensor and\n>       subsequently incorporated within the Work.\n>\n>
-    \   2. Grant of Copyright License. Subject to the terms and conditions of\n>       this
-    License, each Contributor hereby grants to You a perpetual,\n>       worldwide,
-    non-exclusive, no-charge, royalty-free, irrevocable\n>       copyright license
-    to reproduce, prepare Derivative Works of,\n>       publicly display, publicly
-    perform, sublicense, and distribute the\n>       Work and such Derivative Works
-    in Source or Object form.\n>\n>    3. Grant of Patent License. Subject to the
-    terms and conditions of\n>       this License, each Contributor hereby grants
-    to You a perpetual,\n>       worldwide, non-exclusive, no-charge, royalty-free,
-    irrevocable\n>       (except as stated in this section) patent license to make,
-    have made,\n>       use, offer to sell, sell, import, and otherwise transfer the
-    Work,\n>       where such license applies only to those patent claims licensable\n>
-    \      by such Contributor that are necessarily infringed by their\n>       Contribution(s)
-    alone or by combination of their Contribution(s)\n>       with the Work to which
-    such Contribution(s) was submitted. If You\n>       institute patent litigation
-    against any entity (including a\n>       cross-claim or counterclaim in a lawsuit)
-    alleging that the Work\n>       or a Contribution incorporated within the Work
-    constitutes direct\n>       or contributory patent infringement, then any patent
-    licenses\n>       granted to You under this License for that Work shall terminate\n>
-    \      as of the date such litigation is filed.\n>\n>    4. Redistribution. You
-    may reproduce and distribute copies of the\n>       Work or Derivative Works thereof
-    in any medium, with or without\n>       modifications, and in Source or Object
-    form, provided that You\n>       meet the following conditions:\n>\n>       (a)
-    You must give any other recipients of the Work or\n>           Derivative Works
-    a copy of this License; and\n>\n>       (b) You must cause any modified files
-    to carry prominent notices\n>           stating that You changed the files; and\n>\n>
-    \      (c) You must retain, in the Source form of any Derivative Works\n>           that
-    You distribute, all copyright, patent, trademark, and\n>           attribution
-    notices from the Source form of the Work,\n>           excluding those notices
-    that do not pertain to any part of\n>           the Derivative Works; and\n>\n>
-    \      (d) If the Work includes a \"NOTICE\" text file as part of its\n>           distribution,
-    then any Derivative Works that You distribute must\n>           include a readable
-    copy of the attribution notices contained\n>           within such NOTICE file,
-    excluding those notices that do not\n>           pertain to any part of the Derivative
-    Works, in at least one\n>           of the following places: within a NOTICE text
-    file distributed\n>           as part of the Derivative Works; within the Source
-    form or\n>           documentation, if provided along with the Derivative Works;
-    or,\n>           within a display generated by the Derivative Works, if and\n>
-    \          wherever such third-party notices normally appear. The contents\n>
-    \          of the NOTICE file are for informational purposes only and\n>           do
-    not modify the License. You may add Your own attribution\n>           notices
-    within Derivative Works that You distribute, alongside\n>           or as an addendum
-    to the NOTICE text from the Work, provided\n>           that such additional attribution
-    notices cannot be construed\n>           as modifying the License.\n>\n>       You
-    may add Your own copyright statement to Your modifications and\n>       may provide
-    additional or different license terms and conditions\n>       for use, reproduction,
-    or distribution of Your modifications, or\n>       for any such Derivative Works
-    as a whole, provided Your use,\n>       reproduction, and distribution of the
-    Work otherwise complies with\n>       the conditions stated in this License.\n>\n>
-    \   5. Submission of Contributions. Unless You explicitly state otherwise,\n>
-    \      any Contribution intentionally submitted for inclusion in the Work\n>       by
-    You to the Licensor shall be under the terms and conditions of\n>       this License,
-    without any additional terms or conditions.\n>       Notwithstanding the above,
-    nothing herein shall supersede or modify\n>       the terms of any separate license
-    agreement you may have executed\n>       with Licensor regarding such Contributions.\n>\n>
-    \   6. Trademarks. This License does not grant permission to use the trade\n>
-    \      names, trademarks, service marks, or product names of the Licensor,\n>
-    \      except as required for reasonable and customary use in describing the\n>
-    \      origin of the Work and reproducing the content of the NOTICE file.\n>\n>
-    \   7. Disclaimer of Warranty. Unless required by applicable law or\n>       agreed
-    to in writing, Licensor provides the Work (and each\n>       Contributor provides
-    its Contributions) on an \"AS IS\" BASIS,\n>       WITHOUT WARRANTIES OR CONDITIONS
-    OF ANY KIND, either express or\n>       implied, including, without limitation,
-    any warranties or conditions\n>       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY,
-    or FITNESS FOR A\n>       PARTICULAR PURPOSE. You are solely responsible for determining
-    the\n>       appropriateness of using or redistributing the Work and assume any\n>
-    \      risks associated with Your exercise of permissions under this License.\n>\n>
-    \   8. Limitation of Liability. In no event and under no legal theory,\n>       whether
-    in tort (including negligence), contract, or otherwise,\n>       unless required
-    by applicable law (such as deliberate and grossly\n>       negligent acts) or
-    agreed to in writing, shall any Contributor be\n>       liable to You for damages,
-    including any direct, indirect, special,\n>       incidental, or consequential
-    damages of any character arising as a\n>       result of this License or out of
-    the use or inability to use the\n>       Work (including but not limited to damages
-    for loss of goodwill,\n>       work stoppage, computer failure or malfunction,
-    or any and all\n>       other commercial damages or losses), even if such Contributor\n>
-    \      has been advised of the possibility of such damages.\n>\n>    9. Accepting
-    Warranty or Additional Liability. While redistributing\n>       the Work or Derivative
-    Works thereof, You may choose to offer,\n>       and charge a fee for, acceptance
-    of support, warranty, indemnity,\n>       or other liability obligations and/or
-    rights consistent with this\n>       License. However, in accepting such obligations,
-    You may act only\n>       on Your own behalf and on Your sole responsibility,
-    not on behalf\n>       of any other Contributor, and only if You agree to indemnify,\n>
-    \      defend, and hold each Contributor harmless for any liability\n>       incurred
-    by, or claims asserted against, such Contributor by reason\n>       of your accepting
-    any such warranty or additional liability.\n>\n>    END OF TERMS AND CONDITIONS\n>\n>
-    \   APPENDIX: How to apply the Apache License to your work.\n>\n>       To apply
-    the Apache License to your work, attach the following\n>       boilerplate notice,
-    with the fields enclosed by brackets \"{}\"\n>       replaced with your own identifying
-    information. (Don't include\n>       the brackets!)  The text should be enclosed
-    in the appropriate\n>       comment syntax for the file format. We also recommend
-    that a\n>       file or class name and description of purpose be included on the\n>
-    \      same \"printed page\" as the copyright notice for easier\n>       identification
-    within third-party archives.\n>\n>    Copyright contributors\n>\n>    Licensed
-    under the Apache License, Version 2.0 (the \"License\");\n>    you may not use
-    this file except in compliance with the License.\n>    You may obtain a copy of
-    the License at\n>\n>        http://www.apache.org/licenses/LICENSE-2.0\n>\n>    Unless
-    required by applicable law or agreed to in writing, software\n>    distributed
-    under the License is distributed on an \"AS IS\" BASIS,\n>    WITHOUT WARRANTIES
-    OR CONDITIONS OF ANY KIND, either express or implied.\n>    See the License for
-    the specific language governing permissions and\n>    limitations under the License.\n\n----------------------------------------\n\n###
-    espree@v9.4.1\n\nLicense: BSD-2-Clause\nBy: Nicholas C. Zakas\n\n> BSD 2-Clause
-    License\n>\n> Copyright (c) Open JS Foundation\n> All rights reserved.\n>\n> Redistribution
-    and use in source and binary forms, with or without\n> modification, are permitted
-    provided that the following conditions are met:\n>\n> 1. Redistributions of source
-    code must retain the above copyright notice, this\n>    list of conditions and
-    the following disclaimer.\n>\n> 2. Redistributions in binary form must reproduce
-    the above copyright notice,\n>    this list of conditions and the following disclaimer
-    in the documentation\n>    and/or other materials provided with the distribution.\n>\n>
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n>
-    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n> IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n> DISCLAIMED.
-    IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n> FOR ANY DIRECT,
-    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n> DAMAGES (INCLUDING,
-    BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n> SERVICES; LOSS OF USE,
-    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n> CAUSED AND ON ANY THEORY
-    OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n> OR TORT (INCLUDING NEGLIGENCE
-    OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n> OF THIS SOFTWARE, EVEN IF ADVISED
-    OF THE POSSIBILITY OF SUCH DAMAGE.\n\n----------------------------------------\n\n###
-    esutils@v2.0.3\n\nLicense: BSD-2-Clause\nRepository: <http://github.com/estools/esutils.git>\n\n>
-    Redistribution and use in source and binary forms, with or without\n> modification,
-    are permitted provided that the following conditions are met:\n>\n>   * Redistributions
-    of source code must retain the above copyright\n>     notice, this list of conditions
-    and the following disclaimer.\n>   * Redistributions in binary form must reproduce
-    the above copyright\n>     notice, this list of conditions and the following disclaimer
-    in the\n>     documentation and/or other materials provided with the distribution.\n>\n>
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n>
-    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n> IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n> ARE DISCLAIMED.
-    IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n> DIRECT, INDIRECT, INCIDENTAL,
-    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n> (INCLUDING, BUT NOT LIMITED TO,
-    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n> LOSS OF USE, DATA, OR PROFITS;
-    OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n> ON ANY THEORY OF LIABILITY, WHETHER
-    IN CONTRACT, STRICT LIABILITY, OR TORT\n> (INCLUDING NEGLIGENCE OR OTHERWISE)
-    ARISING IN ANY WAY OUT OF THE USE OF\n> THIS SOFTWARE, EVEN IF ADVISED OF THE
-    POSSIBILITY OF SUCH DAMAGE.\n\n----------------------------------------\n\n###
-    execa@v6.1.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    extend@v3.0.2\n\nLicense: MIT\nBy: Stefan Thomas\nRepository: <https://github.com/justmoon/node-extend.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2014 Stefan Thomas\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining\n> a copy of this software
-    and associated documentation files (the\n> \"Software\"), to deal in the Software
-    without restriction, including\n> without limitation the rights to use, copy,
-    modify, merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE\n> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION\n> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n>
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    fast-glob@v3.2.12\n\nLicense: MIT\nBy: Denis Malinochkin\n\n> The MIT License
-    (MIT)\n>\n> Copyright (c) Denis Malinochkin\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy\n> of this software and associated
-    documentation files (the \"Software\"), to deal\n> in the Software without restriction,
-    including without limitation the rights\n> to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons
-    to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    fast-json-stable-stringify@v2.1.0\n\nLicense: MIT\nBy: James Halliday\nRepository:
-    <git://github.com/epoberezkin/fast-json-stable-stringify.git>\n\n> This software
-    is released under the MIT license:\n>\n> Copyright (c) 2017 Evgeny Poberezkin\n>
-    Copyright (c) 2013 James Halliday\n>\n> Permission is hereby granted, free of
-    charge, to any person obtaining a copy of\n> this software and associated documentation
-    files (the \"Software\"), to deal in\n> the Software without restriction, including
-    without limitation the rights to\n> use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell copies of\n> the Software, and to permit persons to whom
-    the Software is furnished to do so,\n> subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n> FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n> COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n> IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n> CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    fastq@v1.14.0\n\nLicense: ISC\nBy: Matteo Collina\nRepository: <git+https://github.com/mcollina/fastq.git>\n\n>
-    Copyright (c) 2015-2020, Matteo Collina <matteo.collina@gmail.com>\n>\n> Permission
-    to use, copy, modify, and/or distribute this software for any\n> purpose with
-    or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF\n> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    file-entry-cache@v6.0.1\n\nLicense: MIT\nBy: Roy Riojas\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2015 Roy Riojas\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining a copy\n> of this software and associated documentation
-    files (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    fill-range@v7.0.1\n\nLicense: MIT\nBy: Jon Schlinkert\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2014-present, Jon Schlinkert.\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy\n> of this software and associated
-    documentation files (the \"Software\"), to deal\n> in the Software without restriction,
-    including without limitation the rights\n> to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons
-    to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    find-cache-dir@v3.3.2\n\nLicense: MIT\n\n> MIT License\n>\n> Copyright (c) Sindre
-    Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission is
-    hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    find-parent-dir@v0.3.1\n\nLicense: MIT\nBy: Thorsten Lorenz\nRepository: <git://github.com/thlorenz/find-parent-dir.git>\n\n>
-    Copyright 2013 Thorsten Lorenz. \n> All rights reserved.\n>\n> Permission is hereby
-    granted, free of charge, to any person\n> obtaining a copy of this software and
-    associated documentation\n> files (the \"Software\"), to deal in the Software
-    without\n> restriction, including without limitation the rights to use,\n> copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the\n> Software is furnished to do so, subject to
-    the following\n> conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n> OF MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT\n> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n>
-    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n> FROM, OUT OF OR
-    IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n> OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    find-up@v4.1.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    flat-cache@v3.0.4\n\nLicense: MIT\nBy: Roy Riojas\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2015 Roy Riojas\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining a copy\n> of this software and associated documentation
-    files (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    flatted@v3.2.7\n\nLicense: ISC\nBy: Andrea Giammarchi\nRepository: <git+https://github.com/WebReflection/flatted.git>\n\n>
-    ISC License\n>\n> Copyright (c) 2018-2020, Andrea Giammarchi, @WebReflection\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n> REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n> AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n> INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n> LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE\n> OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR IN CONNECTION WITH THE USE OR\n> PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    flatten@v1.0.3\n\nLicense: MIT\nBy: Joshua Holbrook\nRepository: <git+https://github.com/mk-pmb/flatten-js.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2016 Joshua Holbrook\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    flow-parser@v0.180.0\n\nLicense: MIT\nBy: Flow Team\nRepository: <https://github.com/facebook/flow.git>\n\n----------------------------------------\n\n###
-    fs.realpath@v1.0.0\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <git+https://github.com/isaacs/fs.realpath.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n>\n>
-    ----\n>\n> This library bundles a version of the `fs.realpath` and `fs.realpathSync`\n>
-    methods from Node.js v0.10 under the terms of the Node.js MIT license.\n>\n> Node's
-    license follows, also included at the header of `old.js` which contains\n> the
-    licensed code:\n>\n>   Copyright Joyent, Inc. and other Node contributors.\n>\n>
-    \  Permission is hereby granted, free of charge, to any person obtaining a\n>
-    \  copy of this software and associated documentation files (the \"Software\"),\n>
-    \  to deal in the Software without restriction, including without limitation\n>
-    \  the rights to use, copy, modify, merge, publish, distribute, sublicense,\n>
-    \  and/or sell copies of the Software, and to permit persons to whom the\n>   Software
-    is furnished to do so, subject to the following conditions:\n>\n>   The above
-    copyright notice and this permission notice shall be included in\n>   all copies
-    or substantial portions of the Software.\n>\n>   THE SOFTWARE IS PROVIDED \"AS
-    IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>   IMPLIED, INCLUDING BUT NOT
-    LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n>   FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n>   AUTHORS OR COPYRIGHT HOLDERS BE
-    LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n>   LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING\n>   FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER\n>   DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    function-bind@v1.1.1\n\nLicense: MIT\nBy: Raynos\n\n> Copyright (c) 2013 Raynos.\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy\n>
-    of this software and associated documentation files (the \"Software\"), to deal\n>
-    in the Software without restriction, including without limitation the rights\n>
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies
-    of the Software, and to permit persons to whom the Software is\n> furnished to
-    do so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in\n> all copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n### get-stdin@v8.0.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (https://sindresorhus.com)\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining a copy of this software and associated documentation files
-    (the \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### get-stream@v6.0.1\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (https://sindresorhus.com)\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining a copy of this software and associated documentation files
-    (the \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### glob@v7.2.3\n\nLicense:
-    ISC\nBy: Isaac Z. Schlueter\nRepository: <git://github.com/isaacs/node-glob.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n>\n>
-    ## Glob Logo\n>\n> Glob's logo created by Tanya Brassie <http://tanyabrassie.com/>,
-    licensed\n> under a Creative Commons Attribution-ShareAlike 4.0 International
-    License\n> https://creativecommons.org/licenses/by-sa/4.0/\n\n----------------------------------------\n\n###
-    glob-parent@v5.1.2\n\nLicense: ISC\nBy: Gulp Team\n\n> The ISC License\n>\n> Copyright
-    (c) 2015, 2019 Elan Shanker\n>\n> Permission to use, copy, modify, and/or distribute
-    this software for any\n> purpose with or without fee is hereby granted, provided
-    that the above\n> copyright notice and this permission notice appear in all copies.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n>
-    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY
-    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT,
-    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM
-    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE
-    OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE
-    OF THIS SOFTWARE.\n\n----------------------------------------\n\n### globby@v11.1.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (sindresorhus.com)\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy of this software and associated documentation files (the
-    \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### graceful-fs@v4.2.10\n\nLicense:
-    ISC\nRepository: <https://github.com/isaacs/node-graceful-fs>\n\n> The ISC License\n>\n>
-    Copyright (c) 2011-2022 Isaac Z. Schlueter, Ben Noordhuis, and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    graphql@v15.6.1\n\nLicense: MIT\nRepository: <https://github.com/graphql/graphql-js.git>\n\n>
-    MIT License\n>\n> Copyright (c) GraphQL Contributors\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy\n> of this software and
-    associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    has@v1.0.3\n\nLicense: MIT\nBy: Thiago de Arruda\nRepository: <git://github.com/tarruda/has.git>\n\n>
-    Copyright (c) 2013 Thiago de Arruda\n>\n> Permission is hereby granted, free of
-    charge, to any person\n> obtaining a copy of this software and associated documentation\n>
-    files (the \"Software\"), to deal in the Software without\n> restriction, including
-    without limitation the rights to use,\n> copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the\n> Software is furnished to do so, subject to the following\n> conditions:\n>\n>
-    The above copyright notice and this permission notice shall be\n> included in
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES\n> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND\n> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n>
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n> WHETHER IN AN
-    ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n> FROM, OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR\n> OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    has-flag@v3.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    html-element-attributes@v3.1.0\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT
-    License)\n>\n> Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining\n> a copy of this software
-    and associated documentation files (the\n> 'Software'), to deal in the Software
-    without restriction, including\n> without limitation the rights to use, copy,
-    modify, merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    html-tag-names@v2.0.1\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    human-signals@v3.0.1\n\nLicense: Apache-2.0\nBy: ehmicky\n\n> Apache License\n>
-    \                           Version 2.0, January 2004\n>                         http://www.apache.org/licenses/\n>\n>
-    \   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n>\n>    1. Definitions.\n>\n>
-    \      \"License\" shall mean the terms and conditions for use, reproduction,\n>
-    \      and distribution as defined by Sections 1 through 9 of this document.\n>\n>
-    \      \"Licensor\" shall mean the copyright owner or entity authorized by\n>
-    \      the copyright owner that is granting the License.\n>\n>       \"Legal Entity\"
-    shall mean the union of the acting entity and all\n>       other entities that
-    control, are controlled by, or are under common\n>       control with that entity.
-    For the purposes of this definition,\n>       \"control\" means (i) the power,
-    direct or indirect, to cause the\n>       direction or management of such entity,
-    whether by contract or\n>       otherwise, or (ii) ownership of fifty percent
-    (50%) or more of the\n>       outstanding shares, or (iii) beneficial ownership
-    of such entity.\n>\n>       \"You\" (or \"Your\") shall mean an individual or
-    Legal Entity\n>       exercising permissions granted by this License.\n>\n>       \"Source\"
-    form shall mean the preferred form for making modifications,\n>       including
-    but not limited to software source code, documentation\n>       source, and configuration
-    files.\n>\n>       \"Object\" form shall mean any form resulting from mechanical\n>
-    \      transformation or translation of a Source form, including but\n>       not
-    limited to compiled object code, generated documentation,\n>       and conversions
-    to other media types.\n>\n>       \"Work\" shall mean the work of authorship,
-    whether in Source or\n>       Object form, made available under the License, as
-    indicated by a\n>       copyright notice that is included in or attached to the
-    work\n>       (an example is provided in the Appendix below).\n>\n>       \"Derivative
-    Works\" shall mean any work, whether in Source or Object\n>       form, that is
-    based on (or derived from) the Work and for which the\n>       editorial revisions,
-    annotations, elaborations, or other modifications\n>       represent, as a whole,
-    an original work of authorship. For the purposes\n>       of this License, Derivative
-    Works shall not include works that remain\n>       separable from, or merely link
-    (or bind by name) to the interfaces of,\n>       the Work and Derivative Works
-    thereof.\n>\n>       \"Contribution\" shall mean any work of authorship, including\n>
-    \      the original version of the Work and any modifications or additions\n>
-    \      to that Work or Derivative Works thereof, that is intentionally\n>       submitted
-    to Licensor for inclusion in the Work by the copyright owner\n>       or by an
-    individual or Legal Entity authorized to submit on behalf of\n>       the copyright
-    owner. For the purposes of this definition, \"submitted\"\n>       means any form
-    of electronic, verbal, or written communication sent\n>       to the Licensor
-    or its representatives, including but not limited to\n>       communication on
-    electronic mailing lists, source code control systems,\n>       and issue tracking
-    systems that are managed by, or on behalf of, the\n>       Licensor for the purpose
-    of discussing and improving the Work, but\n>       excluding communication that
-    is conspicuously marked or otherwise\n>       designated in writing by the copyright
-    owner as \"Not a Contribution.\"\n>\n>       \"Contributor\" shall mean Licensor
-    and any individual or Legal Entity\n>       on behalf of whom a Contribution has
-    been received by Licensor and\n>       subsequently incorporated within the Work.\n>\n>
-    \   2. Grant of Copyright License. Subject to the terms and conditions of\n>       this
-    License, each Contributor hereby grants to You a perpetual,\n>       worldwide,
-    non-exclusive, no-charge, royalty-free, irrevocable\n>       copyright license
-    to reproduce, prepare Derivative Works of,\n>       publicly display, publicly
-    perform, sublicense, and distribute the\n>       Work and such Derivative Works
-    in Source or Object form.\n>\n>    3. Grant of Patent License. Subject to the
-    terms and conditions of\n>       this License, each Contributor hereby grants
-    to You a perpetual,\n>       worldwide, non-exclusive, no-charge, royalty-free,
-    irrevocable\n>       (except as stated in this section) patent license to make,
-    have made,\n>       use, offer to sell, sell, import, and otherwise transfer the
-    Work,\n>       where such license applies only to those patent claims licensable\n>
-    \      by such Contributor that are necessarily infringed by their\n>       Contribution(s)
-    alone or by combination of their Contribution(s)\n>       with the Work to which
-    such Contribution(s) was submitted. If You\n>       institute patent litigation
-    against any entity (including a\n>       cross-claim or counterclaim in a lawsuit)
-    alleging that the Work\n>       or a Contribution incorporated within the Work
-    constitutes direct\n>       or contributory patent infringement, then any patent
-    licenses\n>       granted to You under this License for that Work shall terminate\n>
-    \      as of the date such litigation is filed.\n>\n>    4. Redistribution. You
-    may reproduce and distribute copies of the\n>       Work or Derivative Works thereof
-    in any medium, with or without\n>       modifications, and in Source or Object
-    form, provided that You\n>       meet the following conditions:\n>\n>       (a)
-    You must give any other recipients of the Work or\n>           Derivative Works
-    a copy of this License; and\n>\n>       (b) You must cause any modified files
-    to carry prominent notices\n>           stating that You changed the files; and\n>\n>
-    \      (c) You must retain, in the Source form of any Derivative Works\n>           that
-    You distribute, all copyright, patent, trademark, and\n>           attribution
-    notices from the Source form of the Work,\n>           excluding those notices
-    that do not pertain to any part of\n>           the Derivative Works; and\n>\n>
-    \      (d) If the Work includes a \"NOTICE\" text file as part of its\n>           distribution,
-    then any Derivative Works that You distribute must\n>           include a readable
-    copy of the attribution notices contained\n>           within such NOTICE file,
-    excluding those notices that do not\n>           pertain to any part of the Derivative
-    Works, in at least one\n>           of the following places: within a NOTICE text
-    file distributed\n>           as part of the Derivative Works; within the Source
-    form or\n>           documentation, if provided along with the Derivative Works;
-    or,\n>           within a display generated by the Derivative Works, if and\n>
-    \          wherever such third-party notices normally appear. The contents\n>
-    \          of the NOTICE file are for informational purposes only and\n>           do
-    not modify the License. You may add Your own attribution\n>           notices
-    within Derivative Works that You distribute, alongside\n>           or as an addendum
-    to the NOTICE text from the Work, provided\n>           that such additional attribution
-    notices cannot be construed\n>           as modifying the License.\n>\n>       You
-    may add Your own copyright statement to Your modifications and\n>       may provide
-    additional or different license terms and conditions\n>       for use, reproduction,
-    or distribution of Your modifications, or\n>       for any such Derivative Works
-    as a whole, provided Your use,\n>       reproduction, and distribution of the
-    Work otherwise complies with\n>       the conditions stated in this License.\n>\n>
-    \   5. Submission of Contributions. Unless You explicitly state otherwise,\n>
-    \      any Contribution intentionally submitted for inclusion in the Work\n>       by
-    You to the Licensor shall be under the terms and conditions of\n>       this License,
-    without any additional terms or conditions.\n>       Notwithstanding the above,
-    nothing herein shall supersede or modify\n>       the terms of any separate license
-    agreement you may have executed\n>       with Licensor regarding such Contributions.\n>\n>
-    \   6. Trademarks. This License does not grant permission to use the trade\n>
-    \      names, trademarks, service marks, or product names of the Licensor,\n>
-    \      except as required for reasonable and customary use in describing the\n>
-    \      origin of the Work and reproducing the content of the NOTICE file.\n>\n>
-    \   7. Disclaimer of Warranty. Unless required by applicable law or\n>       agreed
-    to in writing, Licensor provides the Work (and each\n>       Contributor provides
-    its Contributions) on an \"AS IS\" BASIS,\n>       WITHOUT WARRANTIES OR CONDITIONS
-    OF ANY KIND, either express or\n>       implied, including, without limitation,
-    any warranties or conditions\n>       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY,
-    or FITNESS FOR A\n>       PARTICULAR PURPOSE. You are solely responsible for determining
-    the\n>       appropriateness of using or redistributing the Work and assume any\n>
-    \      risks associated with Your exercise of permissions under this License.\n>\n>
-    \   8. Limitation of Liability. In no event and under no legal theory,\n>       whether
-    in tort (including negligence), contract, or otherwise,\n>       unless required
-    by applicable law (such as deliberate and grossly\n>       negligent acts) or
-    agreed to in writing, shall any Contributor be\n>       liable to You for damages,
-    including any direct, indirect, special,\n>       incidental, or consequential
-    damages of any character arising as a\n>       result of this License or out of
-    the use or inability to use the\n>       Work (including but not limited to damages
-    for loss of goodwill,\n>       work stoppage, computer failure or malfunction,
-    or any and all\n>       other commercial damages or losses), even if such Contributor\n>
-    \      has been advised of the possibility of such damages.\n>\n>    9. Accepting
-    Warranty or Additional Liability. While redistributing\n>       the Work or Derivative
-    Works thereof, You may choose to offer,\n>       and charge a fee for, acceptance
-    of support, warranty, indemnity,\n>       or other liability obligations and/or
-    rights consistent with this\n>       License. However, in accepting such obligations,
-    You may act only\n>       on Your own behalf and on Your sole responsibility,
-    not on behalf\n>       of any other Contributor, and only if You agree to indemnify,\n>
-    \      defend, and hold each Contributor harmless for any liability\n>       incurred
-    by, or claims asserted against, such Contributor by reason\n>       of your accepting
-    any such warranty or additional liability.\n>\n>    END OF TERMS AND CONDITIONS\n>\n>
-    \   APPENDIX: How to apply the Apache License to your work.\n>\n>       To apply
-    the Apache License to your work, attach the following\n>       boilerplate notice,
-    with the fields enclosed by brackets \"[]\"\n>       replaced with your own identifying
-    information. (Don't include\n>       the brackets!)  The text should be enclosed
-    in the appropriate\n>       comment syntax for the file format. We also recommend
-    that a\n>       file or class name and description of purpose be included on the\n>
-    \      same \"printed page\" as the copyright notice for easier\n>       identification
-    within third-party archives.\n>\n>    Copyright 2021 ehmicky <ehmicky@gmail.com>\n>\n>
-    \   Licensed under the Apache License, Version 2.0 (the \"License\");\n>    you
-    may not use this file except in compliance with the License.\n>    You may obtain
-    a copy of the License at\n>\n>        http://www.apache.org/licenses/LICENSE-2.0\n>\n>
-    \   Unless required by applicable law or agreed to in writing, software\n>    distributed
-    under the License is distributed on an \"AS IS\" BASIS,\n>    WITHOUT WARRANTIES
-    OR CONDITIONS OF ANY KIND, either express or implied.\n>    See the License for
-    the specific language governing permissions and\n>    limitations under the License.\n\n----------------------------------------\n\n###
-    ignore@v5.2.0\n\nLicense: MIT\nBy: kael\nRepository: <git@github.com:kaelzhang/node-ignore.git>\n\n>
-    Copyright (c) 2013 Kael Zhang <i@kael.me>, contributors\n> http://kael.me/\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining\n> a copy
-    of this software and associated documentation files (the\n> \"Software\"), to
-    deal in the Software without restriction, including\n> without limitation the
-    rights to use, copy, modify, merge, publish,\n> distribute, sublicense, and/or
-    sell copies of the Software, and to\n> permit persons to whom the Software is
-    furnished to do so, subject to\n> the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be\n> included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
-    OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT.
-    IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n> LIABLE FOR ANY CLAIM,
-    DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n> OF CONTRACT, TORT OR OTHERWISE,
-    ARISING FROM, OUT OF OR IN CONNECTION\n> WITH THE SOFTWARE OR THE USE OR OTHER
-    DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n### ignore@v5.2.4\n\nLicense:
-    MIT\nBy: kael\nRepository: <git@github.com:kaelzhang/node-ignore.git>\n\n> Copyright
-    (c) 2013 Kael Zhang <i@kael.me>, contributors\n> http://kael.me/\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining\n> a copy of this software
-    and associated documentation files (the\n> \"Software\"), to deal in the Software
-    without restriction, including\n> without limitation the rights to use, copy,
-    modify, merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE\n> LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION\n> OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n>
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    import-fresh@v3.3.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    indent-string@v4.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    indexes-of@v1.0.1\n\nLicense: MIT\nBy: Dominic Tarr\nRepository: <git://github.com/dominictarr/indexes-of.git>\n\n>
-    Copyright (c) 2013 Dominic Tarr\n>\n> Permission is hereby granted, free of charge,
-    \n> to any person obtaining a copy of this software and \n> associated documentation
-    files (the \"Software\"), to \n> deal in the Software without restriction, including
-    \n> without limitation the rights to use, copy, modify, \n> merge, publish, distribute,
-    sublicense, and/or sell \n> copies of the Software, and to permit persons to whom
-    \n> the Software is furnished to do so, \n> subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice \n> shall be included in
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, \n> EXPRESS OR IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES \n> OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. \n> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR \n> ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, \n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
-    THE \n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    inflight@v1.0.6\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <https://github.com/npm/inflight.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter\n>\n> Permission to use,
-    copy, modify, and/or distribute this software for any\n> purpose with or without
-    fee is hereby granted, provided that the above\n> copyright notice and this permission
-    notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\" AND THE
-    AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE INCLUDING ALL
-    IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
-    BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
-    DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
-    AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-    OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    inherits@v2.0.4\n\nLicense: ISC\n\n> The ISC License\n>\n> Copyright (c) Isaac
-    Z. Schlueter\n>\n> Permission to use, copy, modify, and/or distribute this software
-    for any\n> purpose with or without fee is hereby granted, provided that the above\n>
-    copyright notice and this permission notice appear in all copies.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n> REGARD TO
-    THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n> FITNESS.
-    IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n> INDIRECT, OR
-    CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n> LOSS OF USE,
-    DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n> OTHER TORTIOUS
-    ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n> PERFORMANCE OF THIS
-    SOFTWARE.\n\n----------------------------------------\n\n### is-alphabetical@v1.0.4\n\nLicense:
-    MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n> Copyright (c) 2016 Titus Wormer
-    <tituswormer@gmail.com>\n>\n> Permission is hereby granted, free of charge, to
-    any person obtaining\n> a copy of this software and associated documentation files
-    (the\n> 'Software'), to deal in the Software without restriction, including\n>
-    without limitation the rights to use, copy, modify, merge, publish,\n> distribute,
-    sublicense, and/or sell copies of the Software, and to\n> permit persons to whom
-    the Software is furnished to do so, subject to\n> the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be\n> included in
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT
-    LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-    LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n>
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n> SOFTWARE
-    OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-alphanumerical@v1.0.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-arrayish@v0.2.1\n\nLicense: MIT\nBy: Qix\nRepository: <https://github.com/qix-/node-is-arrayish.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2015 JD Ballard\n>\n> Permission is
-    hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-buffer@v2.0.5\n\nLicense: MIT\nBy: Feross Aboukhadijeh\nRepository: <git://github.com/feross/is-buffer.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) Feross Aboukhadijeh\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-core-module@v2.11.0\n\nLicense: MIT\nBy: Jordan Harband\nRepository: <git+https://github.com/inspect-js/is-core-module.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2014 Dave Justice\n>\n> Permission is
-    hereby granted, free of charge, to any person obtaining a copy of\n> this software
-    and associated documentation files (the \"Software\"), to deal in\n> the Software
-    without restriction, including without limitation the rights to\n> use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell copies of\n> the Software,
-    and to permit persons to whom the Software is furnished to do so,\n> subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n>
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n>
-    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n>
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n> CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-decimal@v1.0.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-extglob@v2.1.1\n\nLicense: MIT\nBy: Jon Schlinkert\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2014-2016, Jon Schlinkert\n>\n> Permission is hereby granted, free
-    of charge, to any person obtaining a copy\n> of this software and associated documentation
-    files (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-fullwidth-code-point@v4.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-glob@v4.0.3\n\nLicense: MIT\nBy: Jon Schlinkert\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2014-2017, Jon Schlinkert.\n>\n> Permission is hereby granted, free
-    of charge, to any person obtaining a copy\n> of this software and associated documentation
-    files (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-hexadecimal@v1.0.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-number@v7.0.0\n\nLicense: MIT\nBy: Jon Schlinkert\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2014-present, Jon Schlinkert.\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy\n> of this software and associated
-    documentation files (the \"Software\"), to deal\n> in the Software without restriction,
-    including without limitation the rights\n> to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons
-    to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-path-cwd@v2.2.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-path-inside@v3.0.3\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-plain-obj@v2.1.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-stream@v3.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-whitespace-character@v1.0.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT
-    License)\n>\n> Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining\n> a copy of this software
-    and associated documentation files (the\n> 'Software'), to deal in the Software
-    without restriction, including\n> without limitation the rights to use, copy,
-    modify, merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    is-word-character@v1.0.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    isexe@v2.0.0\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <git+https://github.com/isaacs/isexe.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    jest-docblock@v28.1.1\n\nLicense: MIT\nRepository: <https://github.com/facebook/jest.git>\n\n>
-    MIT License\n>\n> Copyright (c) Facebook, Inc. and its affiliates.\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    js-tokens@v4.0.0\n\nLicense: MIT\nBy: Simon Lydell\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2014, 2015, 2016, 2017, 2018 Simon Lydell\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy\n> of this software and
-    associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    json-parse-even-better-errors@v2.3.1\n\nLicense: MIT\nBy: Kat Marchán\n\n> Copyright
-    2017 Kat Marchán\n> Copyright npm, Inc.\n>\n> Permission is hereby granted, free
-    of charge, to any person obtaining a\n> copy of this software and associated documentation
-    files (the \"Software\"),\n> to deal in the Software without restriction, including
-    without limitation\n> the rights to use, copy, modify, merge, publish, distribute,
-    sublicense,\n> and/or sell copies of the Software, and to permit persons to whom
-    the\n> Software is furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING\n> FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER\n> DEALINGS IN THE SOFTWARE.\n>\n> ---\n>\n> This
-    library is a fork of 'better-json-errors' by Kat Marchán, extended and\n> distributed
-    under the terms of the MIT license above.\n\n----------------------------------------\n\n###
-    json5@v2.2.2\n\nLicense: MIT\nBy: Aseem Kishore\nRepository: <git+https://github.com/json5/json5.git>\n\n>
-    MIT License\n>\n> Copyright (c) 2012-2018 Aseem Kishore, and [others].\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n>\n> [others]:
-    https://github.com/json5/json5/contributors\n\n----------------------------------------\n\n###
-    leven@v2.1.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy\n>
-    of this software and associated documentation files (the \"Software\"), to deal\n>
-    in the Software without restriction, including without limitation the rights\n>
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies
-    of the Software, and to permit persons to whom the Software is\n> furnished to
-    do so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in\n> all copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n### leven@v4.0.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (https://sindresorhus.com)\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining a copy of this software and associated documentation files
-    (the \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### lines-and-columns@v1.2.4\n\nLicense:
-    MIT\nBy: Brian Donovan\nRepository: <https://github.com/eventualbuddha/lines-and-columns.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2015 Brian Donovan\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    lines-and-columns@v2.0.3\n\nLicense: MIT\nBy: Brian Donovan\nRepository: <https://github.com/eventualbuddha/lines-and-columns.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2015 Brian Donovan\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    linguist-languages@v7.21.0\n\nLicense: MIT\nBy: Ika\n\n> MIT License\n>\n> Copyright
-    (c) Ika <ikatyang@gmail.com> (https://github.com/ikatyang)\n>\n> Permission is
-    hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    locate-path@v5.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    lru-cache@v4.1.5\n\nLicense: ISC\nBy: Isaac Z. Schlueter\n\n> The ISC License\n>\n>
-    Copyright (c) Isaac Z. Schlueter and Contributors\n>\n> Permission to use, copy,
-    modify, and/or distribute this software for any\n> purpose with or without fee
-    is hereby granted, provided that the above\n> copyright notice and this permission
-    notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\" AND THE
-    AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE INCLUDING ALL
-    IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
-    BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
-    DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
-    AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-    OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    lru-cache@v6.0.0\n\nLicense: ISC\nBy: Isaac Z. Schlueter\n\n> The ISC License\n>\n>
-    Copyright (c) Isaac Z. Schlueter and Contributors\n>\n> Permission to use, copy,
-    modify, and/or distribute this software for any\n> purpose with or without fee
-    is hereby granted, provided that the above\n> copyright notice and this permission
-    notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\" AND THE
-    AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE INCLUDING ALL
-    IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
-    BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
-    DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
-    AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-    OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    make-dir@v3.1.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    map-age-cleaner@v0.1.3\n\nLicense: MIT\nBy: Sam Verschueren\n\n> MIT License\n>\n>
-    Copyright (c) Sam Verschueren <sam.verschueren@gmail.com> (github.com/SamVerschueren)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    markdown-escapes@v1.0.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    mem@v9.0.2\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    merge-stream@v2.0.0\n\nLicense: MIT\nBy: Stephen Sugden\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) Stephen Sugden <me@stephensugden.com> (stephensugden.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy\n>
-    of this software and associated documentation files (the \"Software\"), to deal\n>
-    in the Software without restriction, including without limitation the rights\n>
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies
-    of the Software, and to permit persons to whom the Software is\n> furnished to
-    do so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in\n> all copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n### merge2@v1.4.1\n\nLicense:
-    MIT\nRepository: <git@github.com:teambition/merge2.git>\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2014-2020 Teambition\n>\n> Permission is hereby granted, free of
-    charge, to any person obtaining a copy\n> of this software and associated documentation
-    files (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    meriyah@v4.2.1\n\nLicense: ISC\nBy: Kenny F.\nRepository: <https://github.com/meriyah/meriyah>\n\n>
-    ISC License\n>\n> Copyright (c) 2019 and later, KFlash and others.\n>\n> Permission
-    to use, copy, modify, and/or distribute this software for any purpose with or
-    without fee is hereby granted, provided that the above copyright notice and this
-    permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\"
-    AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING
-    ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
-    BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
-    CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
-    WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    micromatch@v4.0.5\n\nLicense: MIT\nBy: Jon Schlinkert\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2014-present, Jon Schlinkert.\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy\n> of this software and associated
-    documentation files (the \"Software\"), to deal\n> in the Software without restriction,
-    including without limitation the rights\n> to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons
-    to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    mimic-fn@v4.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    minimatch@v3.1.2\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <git://github.com/isaacs/minimatch.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    minimist@v1.2.6\n\nLicense: MIT\nBy: James Halliday\nRepository: <git://github.com/substack/minimist.git>\n\n>
-    This software is released under the MIT license:\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy of\n> this software and associated
-    documentation files (the \"Software\"), to deal in\n> the Software without restriction,
-    including without limitation the rights to\n> use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of\n> the Software, and to permit persons
-    to whom the Software is furnished to do so,\n> subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n> FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n> COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n> IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n> CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    n-readlines@v1.0.1\n\nLicense: MIT\nBy: Yoan Arnaudov\nRepository: <http://github.com/nacholibre/node-readlines.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2013 Liucw\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy of\n> this software and
-    associated documentation files (the \"Software\"), to deal in\n> the Software
-    without restriction, including without limitation the rights to\n> use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell copies of\n> the Software,
-    and to permit persons to whom the Software is furnished to do so,\n> subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n>
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n>
-    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n>
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n> CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    npm-run-path@v5.1.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    once@v1.4.0\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <git://github.com/isaacs/once>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    onetime@v6.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    outdent@v0.8.0\n\nLicense: MIT\nBy: Andrew Bradley\nRepository: <git+https://github.com/cspotcode/outdent.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2016 Andrew Bradley\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    p-defer@v1.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy\n>
-    of this software and associated documentation files (the \"Software\"), to deal\n>
-    in the Software without restriction, including without limitation the rights\n>
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies
-    of the Software, and to permit persons to whom the Software is\n> furnished to
-    do so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in\n> all copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n### p-limit@v2.3.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (sindresorhus.com)\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy of this software and associated documentation files (the
-    \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### p-locate@v4.1.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (sindresorhus.com)\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy of this software and associated documentation files (the
-    \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### p-map@v4.0.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (https://sindresorhus.com)\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining a copy of this software and associated documentation files
-    (the \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### p-try@v2.2.0\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (sindresorhus.com)\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy of this software and associated documentation files (the
-    \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### parse-entities@v2.0.0\n\nLicense:
-    MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n> Copyright (c) 2015 Titus Wormer
-    <mailto:tituswormer@gmail.com>\n>\n> Permission is hereby granted, free of charge,
-    to any person obtaining\n> a copy of this software and associated documentation
-    files (the\n> 'Software'), to deal in the Software without restriction, including\n>
-    without limitation the rights to use, copy, modify, merge, publish,\n> distribute,
-    sublicense, and/or sell copies of the Software, and to\n> permit persons to whom
-    the Software is furnished to do so, subject to\n> the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be\n> included in
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT
-    LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-    LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n>
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n> SOFTWARE
-    OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    parse-json@v5.2.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    parse-srcset@v1.0.2\n\nLicense: MIT\nBy: Alex Bell\nRepository: <git+https://github.com/albell/parse-srcset.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2014 Alex Bell\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy\n> of this software and
-    associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    path-exists@v4.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    path-is-absolute@v1.0.1\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> The MIT License
-    (MIT)\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy\n>
-    of this software and associated documentation files (the \"Software\"), to deal\n>
-    in the Software without restriction, including without limitation the rights\n>
-    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n> copies
-    of the Software, and to permit persons to whom the Software is\n> furnished to
-    do so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in\n> all copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF
-    ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
-    EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
-    OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-    FROM,\n> OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n### path-key@v3.1.1\n\nLicense:
-    MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
-    (sindresorhus.com)\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy of this software and associated documentation files (the
-    \"Software\"), to deal in the Software without restriction, including without
-    limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
-    and/or sell copies of the Software, and to permit persons to whom the Software
-    is furnished to do so, subject to the following conditions:\n>\n> The above copyright
-    notice and this permission notice shall be included in all copies or substantial
-    portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY
-    OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
-    SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-    SOFTWARE.\n\n----------------------------------------\n\n### path-parse@v1.0.7\n\nLicense:
-    MIT\nBy: Javier Blanco\nRepository: <https://github.com/jbgutierrez/path-parse.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2015 Javier Blanco\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    path-type@v4.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    picocolors@v0.2.1\n\nLicense: ISC\nBy: Alexey Raspopov\n\n> ISC License\n>\n>
-    Copyright (c) 2021 Alexey Raspopov, Kostiantyn Denysov, Anton Verinov\n>\n> Permission
-    to use, copy, modify, and/or distribute this software for any\n> purpose with
-    or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF\n> OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    picomatch@v2.3.1\n\nLicense: MIT\nBy: Jon Schlinkert\n\n> The MIT License (MIT)\n>\n>
-    Copyright (c) 2017-present, Jon Schlinkert.\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy\n> of this software and associated
-    documentation files (the \"Software\"), to deal\n> in the Software without restriction,
-    including without limitation the rights\n> to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons
-    to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    pkg-dir@v4.2.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    please-upgrade-node@v3.2.0\n\nLicense: MIT\nBy: typicode\nRepository: <git+https://github.com/typicode/please-upgrade-node.git>\n\n>
-    MIT License\n>\n> Copyright (c) 2017 \n>\n> Permission is hereby granted, free
-    of charge, to any person obtaining a copy\n> of this software and associated documentation
-    files (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    postcss@v7.0.39\n\nLicense: MIT\nBy: Andrey Sitnik\n\n> The MIT License (MIT)\n>\n>
-    Copyright 2013 Andrey Sitnik <andrey@sitnik.ru>\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy of\n> this software and associated
-    documentation files (the \"Software\"), to deal in\n> the Software without restriction,
-    including without limitation the rights to\n> use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of\n> the Software, and to permit persons
-    to whom the Software is furnished to do so,\n> subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n> FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n> COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n> IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n> CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    postcss-less@v3.1.4\n\nLicense: MIT\nBy: Denys Kniazevych\n\n> The MIT License
-    (MIT)\n>\n> Copyright (c) 2013 Andrey Sitnik <andrey@sitnik.ru>\n> Copyright (c)
-    2016 Denys Kniazevych <webschik@gmail.com>\n> Copyright (c) 2016 Pat Sissons <patricksissons@gmail.com>\n>
-    Copyright (c) 2017 Andrew Powell <andrew@shellscape.org>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy\n> of this software and
-    associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    postcss-media-query-parser@v0.2.3\n\nLicense: MIT\nBy: dryoma\nRepository: <git+https://github.com/dryoma/postcss-media-query-parser.git>\n\n----------------------------------------\n\n###
-    postcss-scss@v2.1.1\n\nLicense: MIT\nBy: Andrey Sitnik\n\n> The MIT License (MIT)\n>\n>
-    Copyright 2013 Andrey Sitnik <andrey@sitnik.ru>\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy of\n> this software and associated
-    documentation files (the \"Software\"), to deal in\n> the Software without restriction,
-    including without limitation the rights to\n> use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of\n> the Software, and to permit persons
-    to whom the Software is furnished to do so,\n> subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n> FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n> COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n> IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n> CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    postcss-selector-parser@v2.2.3\n\nLicense: MIT\nBy: Ben Briggs\n\n> Copyright
-    (c) Ben Briggs <beneb.info@gmail.com> (http://beneb.info)\n>\n> Permission is
-    hereby granted, free of charge, to any person\n> obtaining a copy of this software
-    and associated documentation\n> files (the \"Software\"), to deal in the Software
-    without\n> restriction, including without limitation the rights to use,\n> copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the\n> Software is furnished to do so, subject to
-    the following\n> conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n> OF MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT\n> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n>
-    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n> FROM, OUT OF OR
-    IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n> OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    postcss-values-parser@v2.0.1\n\nLicense: MIT\nBy: Andrew Powell (shellscape)\n\n>
-    Copyright (c) Andrew Powell <andrew@shellscape.org>\n>\n> Permission is hereby
-    granted, free of charge, to any person\n> obtaining a copy of this software and
-    associated documentation\n> files (the \"Software\"), to deal in the Software
-    without\n> restriction, including without limitation the rights to use,\n> copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the\n> Software is furnished to do so, subject to
-    the following\n> conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES\n> OF MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND\n> NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT\n> HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\n>
-    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n> FROM, OUT OF OR
-    IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n> OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    pseudomap@v1.0.2\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <git+https://github.com/isaacs/pseudomap.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    queue-microtask@v1.2.3\n\nLicense: MIT\nBy: Feross Aboukhadijeh\nRepository: <git://github.com/feross/queue-microtask.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) Feross Aboukhadijeh\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of\n> this software
-    and associated documentation files (the \"Software\"), to deal in\n> the Software
-    without restriction, including without limitation the rights to\n> use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell copies of\n> the Software,
-    and to permit persons to whom the Software is furnished to do so,\n> subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n>
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n>
-    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n>
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n> CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    remark-footnotes@v2.0.0\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2020 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    remark-math@v3.0.1\n\nLicense: MIT\nBy: Junyoung Choi\n\n----------------------------------------\n\n###
-    remark-parse@v8.0.3\n\nLicense: MIT\nBy: Titus Wormer\n\n----------------------------------------\n\n###
-    repeat-string@v1.6.1\n\nLicense: MIT\nBy: Jon Schlinkert\n\n> The MIT License
-    (MIT)\n>\n> Copyright (c) 2014-2016, Jon Schlinkert.\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy\n> of this software and
-    associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    resolve@v1.22.1\n\nLicense: MIT\nBy: James Halliday\nRepository: <git://github.com/browserify/resolve.git>\n\n>
-    MIT License\n>\n> Copyright (c) 2012 James Halliday\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy\n> of this software and
-    associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    resolve-from@v4.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    reusify@v1.0.4\n\nLicense: MIT\nBy: Matteo Collina\nRepository: <git+https://github.com/mcollina/reusify.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2015 Matteo Collina\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    rimraf@v3.0.2\n\nLicense: ISC\nBy: Isaac Z. Schlueter\n\n> The ISC License\n>\n>
-    Copyright (c) Isaac Z. Schlueter and Contributors\n>\n> Permission to use, copy,
-    modify, and/or distribute this software for any\n> purpose with or without fee
-    is hereby granted, provided that the above\n> copyright notice and this permission
-    notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\" AND THE
-    AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE INCLUDING ALL
-    IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
-    BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
-    DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
-    AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-    OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    rollup-plugin-node-polyfills@v0.2.1\n\nLicense: MIT\nRepository: <git@github.com:ionic-team/rollup-plugin-node-polyfills.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2019 these people\n>\n> Permission is
-    hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    run-parallel@v1.2.0\n\nLicense: MIT\nBy: Feross Aboukhadijeh\nRepository: <git://github.com/feross/run-parallel.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) Feross Aboukhadijeh\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of\n> this software
-    and associated documentation files (the \"Software\"), to deal in\n> the Software
-    without restriction, including without limitation the rights to\n> use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell copies of\n> the Software,
-    and to permit persons to whom the Software is furnished to do so,\n> subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n>
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n>
-    COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n>
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n> CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    sdbm@v2.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    semver@v6.3.0\n\nLicense: ISC\n\n> The ISC License\n>\n> Copyright (c) Isaac Z.
-    Schlueter and Contributors\n>\n> Permission to use, copy, modify, and/or distribute
-    this software for any\n> purpose with or without fee is hereby granted, provided
-    that the above\n> copyright notice and this permission notice appear in all copies.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n>
-    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY
-    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT,
-    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM
-    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE
-    OR OTHER TORTIOUS ACTION, ARISING OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE
-    OF THIS SOFTWARE.\n\n----------------------------------------\n\n### semver@v7.3.7\n\nLicense:
-    ISC\nBy: GitHub Inc.\nRepository: <https://github.com/npm/node-semver.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    semver@v7.3.8\n\nLicense: ISC\nBy: GitHub Inc.\nRepository: <https://github.com/npm/node-semver.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    semver-compare@v1.0.0\n\nLicense: MIT\nBy: James Halliday\nRepository: <git://github.com/substack/semver-compare.git>\n\n>
-    This software is released under the MIT license:\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy of\n> this software and associated
-    documentation files (the \"Software\"), to deal in\n> the Software without restriction,
-    including without limitation the rights to\n> use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies of\n> the Software, and to permit persons
-    to whom the Software is furnished to do so,\n> subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n> FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n> COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n> IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n> CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    shebang-command@v2.0.0\n\nLicense: MIT\nBy: Kevin Mårtensson\n\n> MIT License\n>\n>
-    Copyright (c) Kevin Mårtensson <kevinmartensson@gmail.com> (github.com/kevva)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    shebang-regex@v3.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    sigmund@v1.0.1\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <git://github.com/isaacs/sigmund>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    signal-exit@v3.0.7\n\nLicense: ISC\nBy: Ben Coe\nRepository: <https://github.com/tapjs/signal-exit.git>\n\n>
-    The ISC License\n>\n> Copyright (c) 2015, Contributors\n>\n> Permission to use,
-    copy, modify, and/or distribute this software\n> for any purpose with or without
-    fee is hereby granted, provided\n> that the above copyright notice and this permission
-    notice\n> appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED \"AS IS\" AND THE
-    AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE INCLUDING ALL
-    IMPLIED WARRANTIES\n> OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
-    BE\n> LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES\n> OR
-    ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,\n> WHETHER
-    IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,\n> ARISING OUT
-    OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    simple-html-tokenizer@v0.5.11\n\nLicense: MIT\nRepository: <https://github.com/tildeio/simple-html-tokenizer.git>\n\n>
-    Copyright (c) 2014 Yehuda Katz and contributors\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy of\n> this software and associated
-    documentation files (the \"Software\"), to deal in\n> the Software without restriction,
-    including without limitation the rights to\n> use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell copies\n> of the Software, and to permit persons
-    to whom the Software is furnished to do\n> so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in all\n>
-    copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    slash@v3.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    state-toggle@v1.0.3\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    string-width@v5.0.1\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    strip-ansi@v7.0.1\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    strip-final-newline@v3.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    supports-color@v5.5.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    temp-dir@v2.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    tempy@v2.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n> Copyright
-    (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy of this software
-    and associated documentation files (the \"Software\"), to deal in the Software
-    without restriction, including without limitation the rights to use, copy, modify,
-    merge, publish, distribute, sublicense, and/or sell copies of the Software, and
-    to permit persons to whom the Software is furnished to do so, subject to the following
-    conditions:\n>\n> The above copyright notice and this permission notice shall
-    be included in all copies or substantial portions of the Software.\n>\n> THE SOFTWARE
-    IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
-    BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
-    THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    to-regex-range@v5.0.1\n\nLicense: MIT\nBy: Jon Schlinkert\n\n> The MIT License
-    (MIT)\n>\n> Copyright (c) 2015-present, Jon Schlinkert.\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy\n> of this software and
-    associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    trim@v0.0.1\n\nBy: TJ Holowaychuk\n\n----------------------------------------\n\n###
-    trim-trailing-lines@v1.1.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2015 Titus Wormer <mailto:tituswormer@gmail.com>\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining\n> a copy of this software
-    and associated documentation files (the\n> 'Software'), to deal in the Software
-    without restriction, including\n> without limitation the rights to use, copy,
-    modify, merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    trough@v1.0.5\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n> Copyright
-    (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy\n> of this software and associated
-    documentation files (the \"Software\"), to deal\n> in the Software without restriction,
-    including without limitation the rights\n> to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons
-    to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    tslib@v1.14.1\n\nLicense: 0BSD\nBy: Microsoft Corp.\nRepository: <https://github.com/Microsoft/tslib.git>\n\n>
-    Copyright (c) Microsoft Corporation.\n> \n> Permission to use, copy, modify, and/or
-    distribute this software for any\n> purpose with or without fee is hereby granted.\n>
-    \n> THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-    WITH\n> REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\n>
-    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n>
-    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n>
-    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n>
-    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n> PERFORMANCE
-    OF THIS SOFTWARE.\n\n----------------------------------------\n\n### tsutils@v3.21.0\n\nLicense:
-    MIT\nBy: Klaus Meinhardt\nRepository: <https://github.com/ajafff/tsutils>\n\n>
-    The MIT License (MIT)\n> \n> Copyright (c) 2017 Klaus Meinhardt\n> \n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n> \n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>
-    \n> THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-    OR\n> IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n>
-    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n>
-    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY,
-    WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR
-    IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    typescript@v5.0.2\n\nLicense: Apache-2.0\nBy: Microsoft Corp.\nRepository: <https://github.com/Microsoft/TypeScript.git>\n\n>
-    Apache License\n> \n> Version 2.0, January 2004\n> \n> http://www.apache.org/licenses/
-    \n> \n> TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n> \n> 1.
-    Definitions.\n> \n> \"License\" shall mean the terms and conditions for use, reproduction,
-    and distribution as defined by Sections 1 through 9 of this document.\n> \n> \"Licensor\"
-    shall mean the copyright owner or entity authorized by the copyright owner that
-    is granting the License.\n> \n> \"Legal Entity\" shall mean the union of the acting
-    entity and all other entities that control, are controlled by, or are under common
-    control with that entity. For the purposes of this definition, \"control\" means
-    (i) the power, direct or indirect, to cause the direction or management of such
-    entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%)
-    or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n>
-    \n> \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising
-    permissions granted by this License.\n> \n> \"Source\" form shall mean the preferred
-    form for making modifications, including but not limited to software source code,
-    documentation source, and configuration files.\n> \n> \"Object\" form shall mean
-    any form resulting from mechanical transformation or translation of a Source form,
-    including but not limited to compiled object code, generated documentation, and
-    conversions to other media types.\n> \n> \"Work\" shall mean the work of authorship,
-    whether in Source or Object form, made available under the License, as indicated
-    by a copyright notice that is included in or attached to the work (an example
-    is provided in the Appendix below).\n> \n> \"Derivative Works\" shall mean any
-    work, whether in Source or Object form, that is based on (or derived from) the
-    Work and for which the editorial revisions, annotations, elaborations, or other
-    modifications represent, as a whole, an original work of authorship. For the purposes
-    of this License, Derivative Works shall not include works that remain separable
-    from, or merely link (or bind by name) to the interfaces of, the Work and Derivative
-    Works thereof.\n> \n> \"Contribution\" shall mean any work of authorship, including
-    the original version of the Work and any modifications or additions to that Work
-    or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion
-    in the Work by the copyright owner or by an individual or Legal Entity authorized
-    to submit on behalf of the copyright owner. For the purposes of this definition,
-    \"submitted\" means any form of electronic, verbal, or written communication sent
-    to the Licensor or its representatives, including but not limited to communication
-    on electronic mailing lists, source code control systems, and issue tracking systems
-    that are managed by, or on behalf of, the Licensor for the purpose of discussing
-    and improving the Work, but excluding communication that is conspicuously marked
-    or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n>
-    \n> \"Contributor\" shall mean Licensor and any individual or Legal Entity on
-    behalf of whom a Contribution has been received by Licensor and subsequently incorporated
-    within the Work.\n> \n> 2. Grant of Copyright License. Subject to the terms and
-    conditions of this License, each Contributor hereby grants to You a perpetual,
-    worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license
-    to reproduce, prepare Derivative Works of, publicly display, publicly perform,
-    sublicense, and distribute the Work and such Derivative Works in Source or Object
-    form.\n> \n> 3. Grant of Patent License. Subject to the terms and conditions of
-    this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive,
-    no-charge, royalty-free, irrevocable (except as stated in this section) patent
-    license to make, have made, use, offer to sell, sell, import, and otherwise transfer
-    the Work, where such license applies only to those patent claims licensable by
-    such Contributor that are necessarily infringed by their Contribution(s) alone
-    or by combination of their Contribution(s) with the Work to which such Contribution(s)
-    was submitted. If You institute patent litigation against any entity (including
-    a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution
-    incorporated within the Work constitutes direct or contributory patent infringement,
-    then any patent licenses granted to You under this License for that Work shall
-    terminate as of the date such litigation is filed.\n> \n> 4. Redistribution. You
-    may reproduce and distribute copies of the Work or Derivative Works thereof in
-    any medium, with or without modifications, and in Source or Object form, provided
-    that You meet the following conditions:\n> \n> You must give any other recipients
-    of the Work or Derivative Works a copy of this License; and\n> \n> You must cause
-    any modified files to carry prominent notices stating that You changed the files;
-    and\n> \n> You must retain, in the Source form of any Derivative Works that You
-    distribute, all copyright, patent, trademark, and attribution notices from the
-    Source form of the Work, excluding those notices that do not pertain to any part
-    of the Derivative Works; and\n> \n> If the Work includes a \"NOTICE\" text file
-    as part of its distribution, then any Derivative Works that You distribute must
-    include a readable copy of the attribution notices contained within such NOTICE
-    file, excluding those notices that do not pertain to any part of the Derivative
-    Works, in at least one of the following places: within a NOTICE text file distributed
-    as part of the Derivative Works; within the Source form or documentation, if provided
-    along with the Derivative Works; or, within a display generated by the Derivative
-    Works, if and wherever such third-party notices normally appear. The contents
-    of the NOTICE file are for informational purposes only and do not modify the License.
-    You may add Your own attribution notices within Derivative Works that You distribute,
-    alongside or as an addendum to the NOTICE text from the Work, provided that such
-    additional attribution notices cannot be construed as modifying the License. You
-    may add Your own copyright statement to Your modifications and may provide additional
-    or different license terms and conditions for use, reproduction, or distribution
-    of Your modifications, or for any such Derivative Works as a whole, provided Your
-    use, reproduction, and distribution of the Work otherwise complies with the conditions
-    stated in this License.\n> \n> 5. Submission of Contributions. Unless You explicitly
-    state otherwise, any Contribution intentionally submitted for inclusion in the
-    Work by You to the Licensor shall be under the terms and conditions of this License,
-    without any additional terms or conditions. Notwithstanding the above, nothing
-    herein shall supersede or modify the terms of any separate license agreement you
-    may have executed with Licensor regarding such Contributions.\n> \n> 6. Trademarks.
-    This License does not grant permission to use the trade names, trademarks, service
-    marks, or product names of the Licensor, except as required for reasonable and
-    customary use in describing the origin of the Work and reproducing the content
-    of the NOTICE file.\n> \n> 7. Disclaimer of Warranty. Unless required by applicable
-    law or agreed to in writing, Licensor provides the Work (and each Contributor
-    provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS
-    OF ANY KIND, either express or implied, including, without limitation, any warranties
-    or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR
-    PURPOSE. You are solely responsible for determining the appropriateness of using
-    or redistributing the Work and assume any risks associated with Your exercise
-    of permissions under this License.\n> \n> 8. Limitation of Liability. In no event
-    and under no legal theory, whether in tort (including negligence), contract, or
-    otherwise, unless required by applicable law (such as deliberate and grossly negligent
-    acts) or agreed to in writing, shall any Contributor be liable to You for damages,
-    including any direct, indirect, special, incidental, or consequential damages
-    of any character arising as a result of this License or out of the use or inability
-    to use the Work (including but not limited to damages for loss of goodwill, work
-    stoppage, computer failure or malfunction, or any and all other commercial damages
-    or losses), even if such Contributor has been advised of the possibility of such
-    damages.\n> \n> 9. Accepting Warranty or Additional Liability. While redistributing
-    the Work or Derivative Works thereof, You may choose to offer, and charge a fee
-    for, acceptance of support, warranty, indemnity, or other liability obligations
-    and/or rights consistent with this License. However, in accepting such obligations,
-    You may act only on Your own behalf and on Your sole responsibility, not on behalf
-    of any other Contributor, and only if You agree to indemnify, defend, and hold
-    each Contributor harmless for any liability incurred by, or claims asserted against,
-    such Contributor by reason of your accepting any such warranty or additional liability.\n>
-    \n> END OF TERMS AND CONDITIONS\n\n----------------------------------------\n\n###
-    unherit@v1.1.3\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy\n> of this software and
-    associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    unified@v9.2.1\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy\n> of this software and
-    associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    uniq@v1.0.1\n\nLicense: MIT\nBy: Mikola Lysenko\nRepository: <git://github.com/mikolalysenko/uniq.git>\n\n>
-    The MIT License (MIT)\n>\n> Copyright (c) 2013 Mikola Lysenko\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in\n> all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    unique-string@v3.0.0\n\nLicense: MIT\nBy: Sindre Sorhus\n\n> MIT License\n>\n>
-    Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of
-    this software and associated documentation files (the \"Software\"), to deal in
-    the Software without restriction, including without limitation the rights to use,
-    copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
-    Software, and to permit persons to whom the Software is furnished to do so, subject
-    to the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-    INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
-    PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
-    HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-    OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    unist-util-is@v4.1.0\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT license)\n>\n>
-    Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    unist-util-remove-position@v2.0.1\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The
-    MIT License)\n>\n> Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining\n> a copy
-    of this software and associated documentation files (the\n> 'Software'), to deal
-    in the Software without restriction, including\n> without limitation the rights
-    to use, copy, modify, merge, publish,\n> distribute, sublicense, and/or sell copies
-    of the Software, and to\n> permit persons to whom the Software is furnished to
-    do so, subject to\n> the following conditions:\n>\n> The above copyright notice
-    and this permission notice shall be\n> included in all copies or substantial portions
-    of the Software.\n>\n> THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY
-    KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n>
-    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO
-    EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES
-    OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING
-    FROM, OUT OF OR IN CONNECTION WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS
-    IN THE SOFTWARE.\n\n----------------------------------------\n\n### unist-util-stringify-position@v2.0.3\n\nLicense:
-    MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n> Copyright (c) 2016 Titus Wormer
-    <tituswormer@gmail.com>\n>\n> Permission is hereby granted, free of charge, to
-    any person obtaining\n> a copy of this software and associated documentation files
-    (the\n> 'Software'), to deal in the Software without restriction, including\n>
-    without limitation the rights to use, copy, modify, merge, publish,\n> distribute,
-    sublicense, and/or sell copies of the Software, and to\n> permit persons to whom
-    the Software is furnished to do so, subject to\n> the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be\n> included in
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR IMPLIED, INCLUDING BUT NOT
-    LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
-    AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-    LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n>
-    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n> SOFTWARE
-    OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    unist-util-visit@v2.0.3\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2015 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    unist-util-visit-parents@v3.1.1\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT
-    License)\n>\n> Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission
-    is hereby granted, free of charge, to any person obtaining\n> a copy of this software
-    and associated documentation files (the\n> 'Software'), to deal in the Software
-    without restriction, including\n> without limitation the rights to use, copy,
-    modify, merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    vfile@v4.2.1\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n> Copyright
-    (c) 2015 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby granted,
-    free of charge, to any person obtaining a copy\n> of this software and associated
-    documentation files (the \"Software\"), to deal\n> in the Software without restriction,
-    including without limitation the rights\n> to use, copy, modify, merge, publish,
-    distribute, sublicense, and/or sell\n> copies of the Software, and to permit persons
-    to whom the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    vfile-location@v3.2.0\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2016 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    vfile-message@v2.0.4\n\nLicense: MIT\nBy: Titus Wormer\n\n> (The MIT License)\n>\n>
-    Copyright (c) 2017 Titus Wormer <tituswormer@gmail.com>\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining\n> a copy of this software and
-    associated documentation files (the\n> 'Software'), to deal in the Software without
-    restriction, including\n> without limitation the rights to use, copy, modify,
-    merge, publish,\n> distribute, sublicense, and/or sell copies of the Software,
-    and to\n> permit persons to whom the Software is furnished to do so, subject to\n>
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be\n> included in all copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\n> EXPRESS OR
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n> MERCHANTABILITY, FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n> IN NO EVENT SHALL THE AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n> CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT,\n> TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-    WITH THE\n> SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n----------------------------------------\n\n###
-    vnopts@v1.0.2\n\nLicense: MIT\nBy: Ika\n\n> MIT License\n>\n> Copyright (c) Ika
-    <ikatyang@gmail.com> (https://github.com/ikatyang)\n>\n> Permission is hereby
-    granted, free of charge, to any person obtaining a copy\n> of this software and
-    associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n\n----------------------------------------\n\n###
-    wcwidth@v1.0.1\n\nLicense: MIT\nBy: Tim Oxley\nRepository: <git+https://github.com/timoxley/wcwidth.git>\n\n>
-    wcwidth.js: JavaScript Portng of Markus Kuhn's wcwidth() Implementation\n> =======================================================================\n>\n>
-    Copyright (C) 2012 by Jun Woong.\n>\n> This package is a JavaScript porting of
-    `wcwidth()` implementation\n> [by Markus Kuhn](http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c).\n>\n>
-    Permission is hereby granted, free of charge, to any person obtaining a copy of\n>
-    this software and associated documentation files (the \"Software\"), to deal in\n>
-    the Software without restriction, including without limitation the rights to\n>
-    use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\n>
-    of the Software, and to permit persons to whom the Software is furnished to do\n>
-    so, subject to the following conditions:\n>\n> The above copyright notice and
-    this permission notice shall be included in all\n> copies or substantial portions
-    of the Software.\n>\n>\n> THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS
-    OR IMPLIED WARRANTIES,\n> INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-    OF MERCHANTABILITY AND\n> FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
-    NO EVENT SHALL THE AUTHOR\n> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
-    INCIDENTAL, SPECIAL,\n> EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-    LIMITED TO,\n> PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
-    OR PROFITS; OR\n> BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-    WHETHER\n> IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n>
-    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n>
-    POSSIBILITY OF SUCH DAMAGE.\n\n----------------------------------------\n\n###
-    which@v2.0.2\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <git://github.com/isaacs/node-which.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    wrappy@v1.0.2\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <https://github.com/npm/wrappy>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    xtend@v4.0.2\n\nLicense: MIT\nBy: Raynos\n\n> The MIT License (MIT)\n> Copyright
-    (c) 2012-2014 Raynos.\n>\n> Permission is hereby granted, free of charge, to any
-    person obtaining a copy\n> of this software and associated documentation files
-    (the \"Software\"), to deal\n> in the Software without restriction, including
-    without limitation the rights\n> to use, copy, modify, merge, publish, distribute,
-    sublicense, and/or sell\n> copies of the Software, and to permit persons to whom
-    the Software is\n> furnished to do so, subject to the following conditions:\n>\n>
-    The above copyright notice and this permission notice shall be included in\n>
-    all copies or substantial portions of the Software.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n> IMPLIED, INCLUDING BUT
-    NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS FOR A PARTICULAR
-    PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS OR COPYRIGHT HOLDERS
-    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER IN AN ACTION OF
-    CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION WITH THE
-    SOFTWARE OR THE USE OR OTHER DEALINGS IN\n> THE SOFTWARE.\n\n----------------------------------------\n\n###
-    yallist@v2.1.2\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <git+https://github.com/isaacs/yallist.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    yallist@v4.0.0\n\nLicense: ISC\nBy: Isaac Z. Schlueter\nRepository: <git+https://github.com/isaacs/yallist.git>\n\n>
-    The ISC License\n>\n> Copyright (c) Isaac Z. Schlueter and Contributors\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any\n> purpose
-    with or without fee is hereby granted, provided that the above\n> copyright notice
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n> WITH REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF\n> MERCHANTABILITY AND FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR\n> ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES\n> WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-    WHETHER IN AN\n> ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
-    OUT OF OR\n> IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    yaml@v1.10.2\n\nLicense: ISC\nBy: Eemeli Aro\n\n> Copyright 2018 Eemeli Aro <eemeli@gmail.com>\n>\n>
-    Permission to use, copy, modify, and/or distribute this software for any purpose\n>
-    with or without fee is hereby granted, provided that the above copyright notice\n>
-    and this permission notice appear in all copies.\n>\n> THE SOFTWARE IS PROVIDED
-    \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n> REGARD TO THIS SOFTWARE
-    INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n> FITNESS. IN NO EVENT
-    SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n> INDIRECT, OR CONSEQUENTIAL
-    DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS\n> OF USE, DATA OR PROFITS,
-    WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER\n> TORTIOUS ACTION, ARISING
-    OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF\n> THIS SOFTWARE.\n\n----------------------------------------\n\n###
-    yaml-unist-parser@v1.3.1\n\nLicense: MIT\nBy: Ika\n\n> MIT License\n>\n> Copyright
-    (c) Ika <ikatyang@gmail.com> (https://github.com/ikatyang)\n>\n> Permission is
-    hereby granted, free of charge, to any person obtaining a copy\n> of this software
-    and associated documentation files (the \"Software\"), to deal\n> in the Software
-    without restriction, including without limitation the rights\n> to use, copy,
-    modify, merge, publish, distribute, sublicense, and/or sell\n> copies of the Software,
-    and to permit persons to whom the Software is\n> furnished to do so, subject to
-    the following conditions:\n>\n> The above copyright notice and this permission
-    notice shall be included in all\n> copies or substantial portions of the Software.\n>\n>
-    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n>
-    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n> FITNESS
-    FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n> AUTHORS
-    OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n> LIABILITY, WHETHER
-    IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n> OUT OF OR IN CONNECTION
-    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n> SOFTWARE.\n"
-notices: []
diff --git a/.licenses/npm/ts-poet.dep.yml b/.licenses/npm/ts-poet.dep.yml
deleted file mode 100644
index 15ea4f6c0..000000000
--- a/.licenses/npm/ts-poet.dep.yml
+++ /dev/null
@@ -1,216 +0,0 @@
----
-name: ts-poet
-version: 4.15.0
-type: npm
-summary: code generation DSL for TypeScript
-homepage:
-license: apache-2.0
-licenses:
-- sources: LICENSE.txt
-  text: |2+
-
-
-                                     Apache License
-                               Version 2.0, January 2004
-                            http://www.apache.org/licenses/
-
-       TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-       1. Definitions.
-
-          "License" shall mean the terms and conditions for use, reproduction,
-          and distribution as defined by Sections 1 through 9 of this document.
-
-          "Licensor" shall mean the copyright owner or entity authorized by
-          the copyright owner that is granting the License.
-
-          "Legal Entity" shall mean the union of the acting entity and all
-          other entities that control, are controlled by, or are under common
-          control with that entity. For the purposes of this definition,
-          "control" means (i) the power, direct or indirect, to cause the
-          direction or management of such entity, whether by contract or
-          otherwise, or (ii) ownership of fifty percent (50%) or more of the
-          outstanding shares, or (iii) beneficial ownership of such entity.
-
-          "You" (or "Your") shall mean an individual or Legal Entity
-          exercising permissions granted by this License.
-
-          "Source" form shall mean the preferred form for making modifications,
-          including but not limited to software source code, documentation
-          source, and configuration files.
-
-          "Object" form shall mean any form resulting from mechanical
-          transformation or translation of a Source form, including but
-          not limited to compiled object code, generated documentation,
-          and conversions to other media types.
-
-          "Work" shall mean the work of authorship, whether in Source or
-          Object form, made available under the License, as indicated by a
-          copyright notice that is included in or attached to the work
-          (an example is provided in the Appendix below).
-
-          "Derivative Works" shall mean any work, whether in Source or Object
-          form, that is based on (or derived from) the Work and for which the
-          editorial revisions, annotations, elaborations, or other modifications
-          represent, as a whole, an original work of authorship. For the purposes
-          of this License, Derivative Works shall not include works that remain
-          separable from, or merely link (or bind by name) to the interfaces of,
-          the Work and Derivative Works thereof.
-
-          "Contribution" shall mean any work of authorship, including
-          the original version of the Work and any modifications or additions
-          to that Work or Derivative Works thereof, that is intentionally
-          submitted to Licensor for inclusion in the Work by the copyright owner
-          or by an individual or Legal Entity authorized to submit on behalf of
-          the copyright owner. For the purposes of this definition, "submitted"
-          means any form of electronic, verbal, or written communication sent
-          to the Licensor or its representatives, including but not limited to
-          communication on electronic mailing lists, source code control systems,
-          and issue tracking systems that are managed by, or on behalf of, the
-          Licensor for the purpose of discussing and improving the Work, but
-          excluding communication that is conspicuously marked or otherwise
-          designated in writing by the copyright owner as "Not a Contribution."
-
-          "Contributor" shall mean Licensor and any individual or Legal Entity
-          on behalf of whom a Contribution has been received by Licensor and
-          subsequently incorporated within the Work.
-
-       2. Grant of Copyright License. Subject to the terms and conditions of
-          this License, each Contributor hereby grants to You a perpetual,
-          worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-          copyright license to reproduce, prepare Derivative Works of,
-          publicly display, publicly perform, sublicense, and distribute the
-          Work and such Derivative Works in Source or Object form.
-
-       3. Grant of Patent License. Subject to the terms and conditions of
-          this License, each Contributor hereby grants to You a perpetual,
-          worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-          (except as stated in this section) patent license to make, have made,
-          use, offer to sell, sell, import, and otherwise transfer the Work,
-          where such license applies only to those patent claims licensable
-          by such Contributor that are necessarily infringed by their
-          Contribution(s) alone or by combination of their Contribution(s)
-          with the Work to which such Contribution(s) was submitted. If You
-          institute patent litigation against any entity (including a
-          cross-claim or counterclaim in a lawsuit) alleging that the Work
-          or a Contribution incorporated within the Work constitutes direct
-          or contributory patent infringement, then any patent licenses
-          granted to You under this License for that Work shall terminate
-          as of the date such litigation is filed.
-
-       4. Redistribution. You may reproduce and distribute copies of the
-          Work or Derivative Works thereof in any medium, with or without
-          modifications, and in Source or Object form, provided that You
-          meet the following conditions:
-
-          (a) You must give any other recipients of the Work or
-              Derivative Works a copy of this License; and
-
-          (b) You must cause any modified files to carry prominent notices
-              stating that You changed the files; and
-
-          (c) You must retain, in the Source form of any Derivative Works
-              that You distribute, all copyright, patent, trademark, and
-              attribution notices from the Source form of the Work,
-              excluding those notices that do not pertain to any part of
-              the Derivative Works; and
-
-          (d) If the Work includes a "NOTICE" text file as part of its
-              distribution, then any Derivative Works that You distribute must
-              include a readable copy of the attribution notices contained
-              within such NOTICE file, excluding those notices that do not
-              pertain to any part of the Derivative Works, in at least one
-              of the following places: within a NOTICE text file distributed
-              as part of the Derivative Works; within the Source form or
-              documentation, if provided along with the Derivative Works; or,
-              within a display generated by the Derivative Works, if and
-              wherever such third-party notices normally appear. The contents
-              of the NOTICE file are for informational purposes only and
-              do not modify the License. You may add Your own attribution
-              notices within Derivative Works that You distribute, alongside
-              or as an addendum to the NOTICE text from the Work, provided
-              that such additional attribution notices cannot be construed
-              as modifying the License.
-
-          You may add Your own copyright statement to Your modifications and
-          may provide additional or different license terms and conditions
-          for use, reproduction, or distribution of Your modifications, or
-          for any such Derivative Works as a whole, provided Your use,
-          reproduction, and distribution of the Work otherwise complies with
-          the conditions stated in this License.
-
-       5. Submission of Contributions. Unless You explicitly state otherwise,
-          any Contribution intentionally submitted for inclusion in the Work
-          by You to the Licensor shall be under the terms and conditions of
-          this License, without any additional terms or conditions.
-          Notwithstanding the above, nothing herein shall supersede or modify
-          the terms of any separate license agreement you may have executed
-          with Licensor regarding such Contributions.
-
-       6. Trademarks. This License does not grant permission to use the trade
-          names, trademarks, service marks, or product names of the Licensor,
-          except as required for reasonable and customary use in describing the
-          origin of the Work and reproducing the content of the NOTICE file.
-
-       7. Disclaimer of Warranty. Unless required by applicable law or
-          agreed to in writing, Licensor provides the Work (and each
-          Contributor provides its Contributions) on an "AS IS" BASIS,
-          WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-          implied, including, without limitation, any warranties or conditions
-          of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-          PARTICULAR PURPOSE. You are solely responsible for determining the
-          appropriateness of using or redistributing the Work and assume any
-          risks associated with Your exercise of permissions under this License.
-
-       8. Limitation of Liability. In no event and under no legal theory,
-          whether in tort (including negligence), contract, or otherwise,
-          unless required by applicable law (such as deliberate and grossly
-          negligent acts) or agreed to in writing, shall any Contributor be
-          liable to You for damages, including any direct, indirect, special,
-          incidental, or consequential damages of any character arising as a
-          result of this License or out of the use or inability to use the
-          Work (including but not limited to damages for loss of goodwill,
-          work stoppage, computer failure or malfunction, or any and all
-          other commercial damages or losses), even if such Contributor
-          has been advised of the possibility of such damages.
-
-       9. Accepting Warranty or Additional Liability. While redistributing
-          the Work or Derivative Works thereof, You may choose to offer,
-          and charge a fee for, acceptance of support, warranty, indemnity,
-          or other liability obligations and/or rights consistent with this
-          License. However, in accepting such obligations, You may act only
-          on Your own behalf and on Your sole responsibility, not on behalf
-          of any other Contributor, and only if You agree to indemnify,
-          defend, and hold each Contributor harmless for any liability
-          incurred by, or claims asserted against, such Contributor by reason
-          of your accepting any such warranty or additional liability.
-
-       END OF TERMS AND CONDITIONS
-
-       APPENDIX: How to apply the Apache License to your work.
-
-          To apply the Apache License to your work, attach the following
-          boilerplate notice, with the fields enclosed by brackets "[]"
-          replaced with your own identifying information. (Don't include
-          the brackets!)  The text should be enclosed in the appropriate
-          comment syntax for the file format. We also recommend that a
-          file or class name and description of purpose be included on the
-          same "printed page" as the copyright notice for easier
-          identification within third-party archives.
-
-       Copyright [yyyy] [name of copyright owner]
-
-       Licensed under the Apache License, Version 2.0 (the "License");
-       you may not use this file except in compliance with the License.
-       You may obtain a copy of the License at
-
-           http://www.apache.org/licenses/LICENSE-2.0
-
-       Unless required by applicable law or agreed to in writing, software
-       distributed under the License is distributed on an "AS IS" BASIS,
-       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-       See the License for the specific language governing permissions and
-       limitations under the License.
-
-notices: []
-...
diff --git a/.licenses/npm/twirp-ts.dep.yml b/.licenses/npm/twirp-ts.dep.yml
deleted file mode 100644
index f557a4860..000000000
--- a/.licenses/npm/twirp-ts.dep.yml
+++ /dev/null
@@ -1,11 +0,0 @@
----
-name: twirp-ts
-version: 2.5.0
-type: npm
-summary: Typescript implementation of the Twirp protocol
-homepage:
-license: mit
-licenses:
-- sources: README.md
-  text: MIT <3
-notices: []
diff --git a/.licenses/npm/yaml.dep.yml b/.licenses/npm/yaml.dep.yml
deleted file mode 100644
index a870f57bd..000000000
--- a/.licenses/npm/yaml.dep.yml
+++ /dev/null
@@ -1,24 +0,0 @@
----
-name: yaml
-version: 1.10.2
-type: npm
-summary: JavaScript parser and stringifier for YAML
-homepage: https://eemeli.org/yaml/v1/
-license: isc
-licenses:
-- sources: LICENSE
-  text: |
-    Copyright 2018 Eemeli Aro <eemeli@gmail.com>
-
-    Permission to use, copy, modify, and/or distribute this software for any purpose
-    with or without fee is hereby granted, provided that the above copyright notice
-    and this permission notice appear in all copies.
-
-    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
-    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-    FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
-    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-    OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
-    TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
-    THIS SOFTWARE.
-notices: []
diff --git a/README.md b/README.md
index 0c5548981..4508478c6 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+
 # setup-node
 
 [![basic-validation](https://github.com/actions/setup-node/actions/workflows/basic-validation.yml/badge.svg)](https://github.com/actions/setup-node/actions/workflows/basic-validation.yml)
@@ -76,6 +77,10 @@ See [action.yml](action.yml)
     # Set always-auth option in npmrc file.
     # Default: ''
     always-auth: ''
+
+    # Optional mirror to download nodejs binaries from.
+    # Default: ''
+    mirror-url: ''
 ```
 <!-- end usage -->
 
@@ -86,7 +91,7 @@ steps:
 - uses: actions/checkout@v4
 - uses: actions/setup-node@v4
   with:
-    node-version: 18
+    node-version: 22
 - run: npm ci
 - run: npm test
 ```
@@ -103,7 +108,7 @@ The `node-version` input supports the Semantic Versioning Specification, for mor
 
 Examples:
 
- - Major versions: `18`, `20`
+ - Major versions: `20`, `22`
  - More specific versions: `10.15`, `16.15.1` , `18.4.0`
  - NVM LTS syntax: `lts/erbium`, `lts/fermium`, `lts/*`, `lts/-n`
  - Latest release: `*` or `latest`/`current`/`node`
@@ -163,7 +168,7 @@ jobs:
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        node: [ 14, 16, 18 ]
+        node: [ 18, 20, 22 ]
     name: Node ${{ matrix.node }} sample
     steps:
       - uses: actions/checkout@v4
@@ -203,6 +208,7 @@ If the runner is not able to access github.com, any Nodejs versions requested du
  - [Publishing to npmjs and GPR with npm](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-npm)
  - [Publishing to npmjs and GPR with yarn](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-yarn)
  - [Using private packages](docs/advanced-usage.md#use-private-packages)
+ - [Using mirror-url)](https://github.com/aparnajyothi-y/setup-node/edit/add-mirror-url/docs/advanced-usage.md#node-mirrors-nodejs-version-mirrors)
 
 ## Recommended permissions
 
@@ -224,3 +230,5 @@ Contributions are welcome! See [Contributor's Guide](docs/contributors.md)
 ## Code of Conduct
 
 :wave: Be nice. See [our code of conduct](CODE_OF_CONDUCT.md)
+
+
diff --git a/dist/cache-save/index.js b/dist/cache-save/index.js
index c429901f2..128702ad6 100644
--- a/dist/cache-save/index.js
+++ b/dist/cache-save/index.js
@@ -220,7 +220,7 @@ function restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsAr
             };
             const response = yield twirpClient.GetCacheEntryDownloadURL(request);
             if (!response.ok) {
-                core.warning(`Cache not found for keys: ${keys.join(', ')}`);
+                core.debug(`Cache not found for keys: ${keys.join(', ')}`);
                 return undefined;
             }
             core.info(`Cache hit for: ${request.key}`);
@@ -412,12 +412,20 @@ function saveCacheV2(paths, key, options, enableCrossOsArchive = false) {
                 key,
                 version
             };
-            const response = yield twirpClient.CreateCacheEntry(request);
-            if (!response.ok) {
+            let signedUploadUrl;
+            try {
+                const response = yield twirpClient.CreateCacheEntry(request);
+                if (!response.ok) {
+                    throw new Error('Response was not ok');
+                }
+                signedUploadUrl = response.signedUploadUrl;
+            }
+            catch (error) {
+                core.debug(`Failed to reserve cache: ${error}`);
                 throw new ReserveCacheError(`Unable to reserve cache with key ${key}, another job may be creating this cache.`);
             }
             core.debug(`Attempting to upload cache located at: ${archivePath}`);
-            yield cacheHttpClient.saveCache(cacheId, archivePath, response.signedUploadUrl, options);
+            yield cacheHttpClient.saveCache(cacheId, archivePath, signedUploadUrl, options);
             const finalizeRequest = {
                 key,
                 version,
@@ -458,156 +466,13 @@ function saveCacheV2(paths, key, options, enableCrossOsArchive = false) {
 
 /***/ }),
 
-/***/ 4469:
-/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.Timestamp = void 0;
-const runtime_1 = __nccwpck_require__(4061);
-const runtime_2 = __nccwpck_require__(4061);
-const runtime_3 = __nccwpck_require__(4061);
-const runtime_4 = __nccwpck_require__(4061);
-const runtime_5 = __nccwpck_require__(4061);
-const runtime_6 = __nccwpck_require__(4061);
-const runtime_7 = __nccwpck_require__(4061);
-// @generated message type with reflection information, may provide speed optimized methods
-class Timestamp$Type extends runtime_7.MessageType {
-    constructor() {
-        super("google.protobuf.Timestamp", [
-            { no: 1, name: "seconds", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
-            { no: 2, name: "nanos", kind: "scalar", T: 5 /*ScalarType.INT32*/ }
-        ]);
-    }
-    /**
-     * Creates a new `Timestamp` for the current time.
-     */
-    now() {
-        const msg = this.create();
-        const ms = Date.now();
-        msg.seconds = runtime_6.PbLong.from(Math.floor(ms / 1000)).toString();
-        msg.nanos = (ms % 1000) * 1000000;
-        return msg;
-    }
-    /**
-     * Converts a `Timestamp` to a JavaScript Date.
-     */
-    toDate(message) {
-        return new Date(runtime_6.PbLong.from(message.seconds).toNumber() * 1000 + Math.ceil(message.nanos / 1000000));
-    }
-    /**
-     * Converts a JavaScript Date to a `Timestamp`.
-     */
-    fromDate(date) {
-        const msg = this.create();
-        const ms = date.getTime();
-        msg.seconds = runtime_6.PbLong.from(Math.floor(ms / 1000)).toString();
-        msg.nanos = (ms % 1000) * 1000000;
-        return msg;
-    }
-    /**
-     * In JSON format, the `Timestamp` type is encoded as a string
-     * in the RFC 3339 format.
-     */
-    internalJsonWrite(message, options) {
-        let ms = runtime_6.PbLong.from(message.seconds).toNumber() * 1000;
-        if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z"))
-            throw new Error("Unable to encode Timestamp to JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");
-        if (message.nanos < 0)
-            throw new Error("Unable to encode invalid Timestamp to JSON. Nanos must not be negative.");
-        let z = "Z";
-        if (message.nanos > 0) {
-            let nanosStr = (message.nanos + 1000000000).toString().substring(1);
-            if (nanosStr.substring(3) === "000000")
-                z = "." + nanosStr.substring(0, 3) + "Z";
-            else if (nanosStr.substring(6) === "000")
-                z = "." + nanosStr.substring(0, 6) + "Z";
-            else
-                z = "." + nanosStr + "Z";
-        }
-        return new Date(ms).toISOString().replace(".000Z", z);
-    }
-    /**
-     * In JSON format, the `Timestamp` type is encoded as a string
-     * in the RFC 3339 format.
-     */
-    internalJsonRead(json, options, target) {
-        if (typeof json !== "string")
-            throw new Error("Unable to parse Timestamp from JSON " + (0, runtime_5.typeofJsonValue)(json) + ".");
-        let matches = json.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/);
-        if (!matches)
-            throw new Error("Unable to parse Timestamp from JSON. Invalid format.");
-        let ms = Date.parse(matches[1] + "-" + matches[2] + "-" + matches[3] + "T" + matches[4] + ":" + matches[5] + ":" + matches[6] + (matches[8] ? matches[8] : "Z"));
-        if (Number.isNaN(ms))
-            throw new Error("Unable to parse Timestamp from JSON. Invalid value.");
-        if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z"))
-            throw new globalThis.Error("Unable to parse Timestamp from JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");
-        if (!target)
-            target = this.create();
-        target.seconds = runtime_6.PbLong.from(ms / 1000).toString();
-        target.nanos = 0;
-        if (matches[7])
-            target.nanos = (parseInt("1" + matches[7] + "0".repeat(9 - matches[7].length)) - 1000000000);
-        return target;
-    }
-    create(value) {
-        const message = { seconds: "0", nanos: 0 };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* int64 seconds */ 1:
-                    message.seconds = reader.int64().toString();
-                    break;
-                case /* int32 nanos */ 2:
-                    message.nanos = reader.int32();
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* int64 seconds = 1; */
-        if (message.seconds !== "0")
-            writer.tag(1, runtime_1.WireType.Varint).int64(message.seconds);
-        /* int32 nanos = 2; */
-        if (message.nanos !== 0)
-            writer.tag(2, runtime_1.WireType.Varint).int32(message.nanos);
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message google.protobuf.Timestamp
- */
-exports.Timestamp = new Timestamp$Type();
-//# sourceMappingURL=timestamp.js.map
-
-/***/ }),
-
 /***/ 4388:
 /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
 
 "use strict";
 
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.CacheService = exports.LookupCacheEntryResponse = exports.LookupCacheEntryRequest = exports.ListCacheEntriesResponse = exports.ListCacheEntriesRequest = exports.DeleteCacheEntryResponse = exports.DeleteCacheEntryRequest = exports.GetCacheEntryDownloadURLResponse = exports.GetCacheEntryDownloadURLRequest = exports.FinalizeCacheEntryUploadResponse = exports.FinalizeCacheEntryUploadRequest = exports.CreateCacheEntryResponse = exports.CreateCacheEntryRequest = void 0;
+exports.CacheService = exports.GetCacheEntryDownloadURLResponse = exports.GetCacheEntryDownloadURLRequest = exports.FinalizeCacheEntryUploadResponse = exports.FinalizeCacheEntryUploadRequest = exports.CreateCacheEntryResponse = exports.CreateCacheEntryRequest = void 0;
 // @generated by protobuf-ts 2.9.1 with parameter long_type_string,client_none,generate_dependencies
 // @generated from protobuf file "results/api/v1/cache.proto" (package "github.actions.results.api.v1", syntax proto3)
 // tslint:disable
@@ -617,7 +482,6 @@ const runtime_2 = __nccwpck_require__(4061);
 const runtime_3 = __nccwpck_require__(4061);
 const runtime_4 = __nccwpck_require__(4061);
 const runtime_5 = __nccwpck_require__(4061);
-const cacheentry_1 = __nccwpck_require__(3639);
 const cachemetadata_1 = __nccwpck_require__(7988);
 // @generated message type with reflection information, may provide speed optimized methods
 class CreateCacheEntryRequest$Type extends runtime_5.MessageType {
@@ -985,376 +849,25 @@ class GetCacheEntryDownloadURLResponse$Type extends runtime_5.MessageType {
  * @generated MessageType for protobuf message github.actions.results.api.v1.GetCacheEntryDownloadURLResponse
  */
 exports.GetCacheEntryDownloadURLResponse = new GetCacheEntryDownloadURLResponse$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class DeleteCacheEntryRequest$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.DeleteCacheEntryRequest", [
-            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
-            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
-        ]);
-    }
-    create(value) {
-        const message = { key: "" };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
-                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
-                    break;
-                case /* string key */ 2:
-                    message.key = reader.string();
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
-        if (message.metadata)
-            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        /* string key = 2; */
-        if (message.key !== "")
-            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.DeleteCacheEntryRequest
- */
-exports.DeleteCacheEntryRequest = new DeleteCacheEntryRequest$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class DeleteCacheEntryResponse$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.DeleteCacheEntryResponse", [
-            { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
-            { no: 2, name: "entry_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ }
-        ]);
-    }
-    create(value) {
-        const message = { ok: false, entryId: "0" };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* bool ok */ 1:
-                    message.ok = reader.bool();
-                    break;
-                case /* int64 entry_id */ 2:
-                    message.entryId = reader.int64().toString();
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* bool ok = 1; */
-        if (message.ok !== false)
-            writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);
-        /* int64 entry_id = 2; */
-        if (message.entryId !== "0")
-            writer.tag(2, runtime_1.WireType.Varint).int64(message.entryId);
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.DeleteCacheEntryResponse
- */
-exports.DeleteCacheEntryResponse = new DeleteCacheEntryResponse$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class ListCacheEntriesRequest$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.ListCacheEntriesRequest", [
-            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
-            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 3, name: "restore_keys", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ }
-        ]);
-    }
-    create(value) {
-        const message = { key: "", restoreKeys: [] };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
-                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
-                    break;
-                case /* string key */ 2:
-                    message.key = reader.string();
-                    break;
-                case /* repeated string restore_keys */ 3:
-                    message.restoreKeys.push(reader.string());
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
-        if (message.metadata)
-            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        /* string key = 2; */
-        if (message.key !== "")
-            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
-        /* repeated string restore_keys = 3; */
-        for (let i = 0; i < message.restoreKeys.length; i++)
-            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.restoreKeys[i]);
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.ListCacheEntriesRequest
- */
-exports.ListCacheEntriesRequest = new ListCacheEntriesRequest$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class ListCacheEntriesResponse$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.ListCacheEntriesResponse", [
-            { no: 1, name: "entries", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => cacheentry_1.CacheEntry }
-        ]);
-    }
-    create(value) {
-        const message = { entries: [] };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* repeated github.actions.results.entities.v1.CacheEntry entries */ 1:
-                    message.entries.push(cacheentry_1.CacheEntry.internalBinaryRead(reader, reader.uint32(), options));
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* repeated github.actions.results.entities.v1.CacheEntry entries = 1; */
-        for (let i = 0; i < message.entries.length; i++)
-            cacheentry_1.CacheEntry.internalBinaryWrite(message.entries[i], writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.ListCacheEntriesResponse
- */
-exports.ListCacheEntriesResponse = new ListCacheEntriesResponse$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class LookupCacheEntryRequest$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.LookupCacheEntryRequest", [
-            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
-            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 3, name: "restore_keys", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ },
-            { no: 4, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
-        ]);
-    }
-    create(value) {
-        const message = { key: "", restoreKeys: [], version: "" };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
-                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
-                    break;
-                case /* string key */ 2:
-                    message.key = reader.string();
-                    break;
-                case /* repeated string restore_keys */ 3:
-                    message.restoreKeys.push(reader.string());
-                    break;
-                case /* string version */ 4:
-                    message.version = reader.string();
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
-        if (message.metadata)
-            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        /* string key = 2; */
-        if (message.key !== "")
-            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
-        /* repeated string restore_keys = 3; */
-        for (let i = 0; i < message.restoreKeys.length; i++)
-            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.restoreKeys[i]);
-        /* string version = 4; */
-        if (message.version !== "")
-            writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.version);
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.LookupCacheEntryRequest
- */
-exports.LookupCacheEntryRequest = new LookupCacheEntryRequest$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class LookupCacheEntryResponse$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.LookupCacheEntryResponse", [
-            { no: 1, name: "exists", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
-            { no: 2, name: "entry", kind: "message", T: () => cacheentry_1.CacheEntry }
-        ]);
-    }
-    create(value) {
-        const message = { exists: false };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* bool exists */ 1:
-                    message.exists = reader.bool();
-                    break;
-                case /* github.actions.results.entities.v1.CacheEntry entry */ 2:
-                    message.entry = cacheentry_1.CacheEntry.internalBinaryRead(reader, reader.uint32(), options, message.entry);
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* bool exists = 1; */
-        if (message.exists !== false)
-            writer.tag(1, runtime_1.WireType.Varint).bool(message.exists);
-        /* github.actions.results.entities.v1.CacheEntry entry = 2; */
-        if (message.entry)
-            cacheentry_1.CacheEntry.internalBinaryWrite(message.entry, writer.tag(2, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.LookupCacheEntryResponse
- */
-exports.LookupCacheEntryResponse = new LookupCacheEntryResponse$Type();
 /**
  * @generated ServiceType for protobuf service github.actions.results.api.v1.CacheService
  */
 exports.CacheService = new runtime_rpc_1.ServiceType("github.actions.results.api.v1.CacheService", [
     { name: "CreateCacheEntry", options: {}, I: exports.CreateCacheEntryRequest, O: exports.CreateCacheEntryResponse },
     { name: "FinalizeCacheEntryUpload", options: {}, I: exports.FinalizeCacheEntryUploadRequest, O: exports.FinalizeCacheEntryUploadResponse },
-    { name: "GetCacheEntryDownloadURL", options: {}, I: exports.GetCacheEntryDownloadURLRequest, O: exports.GetCacheEntryDownloadURLResponse },
-    { name: "DeleteCacheEntry", options: {}, I: exports.DeleteCacheEntryRequest, O: exports.DeleteCacheEntryResponse },
-    { name: "ListCacheEntries", options: {}, I: exports.ListCacheEntriesRequest, O: exports.ListCacheEntriesResponse },
-    { name: "LookupCacheEntry", options: {}, I: exports.LookupCacheEntryRequest, O: exports.LookupCacheEntryResponse }
+    { name: "GetCacheEntryDownloadURL", options: {}, I: exports.GetCacheEntryDownloadURLRequest, O: exports.GetCacheEntryDownloadURLResponse }
 ]);
 //# sourceMappingURL=cache.js.map
 
 /***/ }),
 
-/***/ 267:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+/***/ 2655:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
 
 "use strict";
 
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.createCacheServiceServer = exports.CacheServiceMethodList = exports.CacheServiceMethod = exports.CacheServiceClientProtobuf = exports.CacheServiceClientJSON = void 0;
-const twirp_ts_1 = __nccwpck_require__(6465);
+exports.CacheServiceClientProtobuf = exports.CacheServiceClientJSON = void 0;
 const cache_1 = __nccwpck_require__(4388);
 class CacheServiceClientJSON {
     constructor(rpc) {
@@ -1362,9 +875,6 @@ class CacheServiceClientJSON {
         this.CreateCacheEntry.bind(this);
         this.FinalizeCacheEntryUpload.bind(this);
         this.GetCacheEntryDownloadURL.bind(this);
-        this.DeleteCacheEntry.bind(this);
-        this.ListCacheEntries.bind(this);
-        this.LookupCacheEntry.bind(this);
     }
     CreateCacheEntry(request) {
         const data = cache_1.CreateCacheEntryRequest.toJson(request, {
@@ -1396,36 +906,6 @@ class CacheServiceClientJSON {
             ignoreUnknownFields: true,
         }));
     }
-    DeleteCacheEntry(request) {
-        const data = cache_1.DeleteCacheEntryRequest.toJson(request, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        });
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "DeleteCacheEntry", "application/json", data);
-        return promise.then((data) => cache_1.DeleteCacheEntryResponse.fromJson(data, {
-            ignoreUnknownFields: true,
-        }));
-    }
-    ListCacheEntries(request) {
-        const data = cache_1.ListCacheEntriesRequest.toJson(request, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        });
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "ListCacheEntries", "application/json", data);
-        return promise.then((data) => cache_1.ListCacheEntriesResponse.fromJson(data, {
-            ignoreUnknownFields: true,
-        }));
-    }
-    LookupCacheEntry(request) {
-        const data = cache_1.LookupCacheEntryRequest.toJson(request, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        });
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "LookupCacheEntry", "application/json", data);
-        return promise.then((data) => cache_1.LookupCacheEntryResponse.fromJson(data, {
-            ignoreUnknownFields: true,
-        }));
-    }
 }
 exports.CacheServiceClientJSON = CacheServiceClientJSON;
 class CacheServiceClientProtobuf {
@@ -1434,9 +914,6 @@ class CacheServiceClientProtobuf {
         this.CreateCacheEntry.bind(this);
         this.FinalizeCacheEntryUpload.bind(this);
         this.GetCacheEntryDownloadURL.bind(this);
-        this.DeleteCacheEntry.bind(this);
-        this.ListCacheEntries.bind(this);
-        this.LookupCacheEntry.bind(this);
     }
     CreateCacheEntry(request) {
         const data = cache_1.CreateCacheEntryRequest.toBinary(request);
@@ -1453,610 +930,9 @@ class CacheServiceClientProtobuf {
         const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "GetCacheEntryDownloadURL", "application/protobuf", data);
         return promise.then((data) => cache_1.GetCacheEntryDownloadURLResponse.fromBinary(data));
     }
-    DeleteCacheEntry(request) {
-        const data = cache_1.DeleteCacheEntryRequest.toBinary(request);
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "DeleteCacheEntry", "application/protobuf", data);
-        return promise.then((data) => cache_1.DeleteCacheEntryResponse.fromBinary(data));
-    }
-    ListCacheEntries(request) {
-        const data = cache_1.ListCacheEntriesRequest.toBinary(request);
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "ListCacheEntries", "application/protobuf", data);
-        return promise.then((data) => cache_1.ListCacheEntriesResponse.fromBinary(data));
-    }
-    LookupCacheEntry(request) {
-        const data = cache_1.LookupCacheEntryRequest.toBinary(request);
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "LookupCacheEntry", "application/protobuf", data);
-        return promise.then((data) => cache_1.LookupCacheEntryResponse.fromBinary(data));
-    }
 }
 exports.CacheServiceClientProtobuf = CacheServiceClientProtobuf;
-var CacheServiceMethod;
-(function (CacheServiceMethod) {
-    CacheServiceMethod["CreateCacheEntry"] = "CreateCacheEntry";
-    CacheServiceMethod["FinalizeCacheEntryUpload"] = "FinalizeCacheEntryUpload";
-    CacheServiceMethod["GetCacheEntryDownloadURL"] = "GetCacheEntryDownloadURL";
-    CacheServiceMethod["DeleteCacheEntry"] = "DeleteCacheEntry";
-    CacheServiceMethod["ListCacheEntries"] = "ListCacheEntries";
-    CacheServiceMethod["LookupCacheEntry"] = "LookupCacheEntry";
-})(CacheServiceMethod || (exports.CacheServiceMethod = CacheServiceMethod = {}));
-exports.CacheServiceMethodList = [
-    CacheServiceMethod.CreateCacheEntry,
-    CacheServiceMethod.FinalizeCacheEntryUpload,
-    CacheServiceMethod.GetCacheEntryDownloadURL,
-    CacheServiceMethod.DeleteCacheEntry,
-    CacheServiceMethod.ListCacheEntries,
-    CacheServiceMethod.LookupCacheEntry,
-];
-function createCacheServiceServer(service) {
-    return new twirp_ts_1.TwirpServer({
-        service,
-        packageName: "github.actions.results.api.v1",
-        serviceName: "CacheService",
-        methodList: exports.CacheServiceMethodList,
-        matchRoute: matchCacheServiceRoute,
-    });
-}
-exports.createCacheServiceServer = createCacheServiceServer;
-function matchCacheServiceRoute(method, events) {
-    switch (method) {
-        case "CreateCacheEntry":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "CreateCacheEntry" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceCreateCacheEntryRequest(ctx, service, data, interceptors);
-            });
-        case "FinalizeCacheEntryUpload":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "FinalizeCacheEntryUpload" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceFinalizeCacheEntryUploadRequest(ctx, service, data, interceptors);
-            });
-        case "GetCacheEntryDownloadURL":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "GetCacheEntryDownloadURL" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceGetCacheEntryDownloadURLRequest(ctx, service, data, interceptors);
-            });
-        case "DeleteCacheEntry":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "DeleteCacheEntry" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceDeleteCacheEntryRequest(ctx, service, data, interceptors);
-            });
-        case "ListCacheEntries":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "ListCacheEntries" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceListCacheEntriesRequest(ctx, service, data, interceptors);
-            });
-        case "LookupCacheEntry":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "LookupCacheEntry" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceLookupCacheEntryRequest(ctx, service, data, interceptors);
-            });
-        default:
-            events.onNotFound();
-            const msg = `no handler found`;
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceCreateCacheEntryRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceCreateCacheEntryJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceCreateCacheEntryProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceFinalizeCacheEntryUploadRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceFinalizeCacheEntryUploadJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceFinalizeCacheEntryUploadProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceGetCacheEntryDownloadURLRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceGetCacheEntryDownloadURLJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceGetCacheEntryDownloadURLProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceDeleteCacheEntryRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceDeleteCacheEntryJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceDeleteCacheEntryProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceListCacheEntriesRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceListCacheEntriesJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceListCacheEntriesProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceLookupCacheEntryRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceLookupCacheEntryJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceLookupCacheEntryProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceCreateCacheEntryJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.CreateCacheEntryRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.CreateCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.CreateCacheEntry(ctx, request);
-        }
-        return JSON.stringify(cache_1.CreateCacheEntryResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceFinalizeCacheEntryUploadJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.FinalizeCacheEntryUploadRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.FinalizeCacheEntryUpload(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.FinalizeCacheEntryUpload(ctx, request);
-        }
-        return JSON.stringify(cache_1.FinalizeCacheEntryUploadResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceGetCacheEntryDownloadURLJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.GetCacheEntryDownloadURLRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.GetCacheEntryDownloadURL(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.GetCacheEntryDownloadURL(ctx, request);
-        }
-        return JSON.stringify(cache_1.GetCacheEntryDownloadURLResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceDeleteCacheEntryJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.DeleteCacheEntryRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.DeleteCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.DeleteCacheEntry(ctx, request);
-        }
-        return JSON.stringify(cache_1.DeleteCacheEntryResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceListCacheEntriesJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.ListCacheEntriesRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.ListCacheEntries(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.ListCacheEntries(ctx, request);
-        }
-        return JSON.stringify(cache_1.ListCacheEntriesResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceLookupCacheEntryJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.LookupCacheEntryRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.LookupCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.LookupCacheEntry(ctx, request);
-        }
-        return JSON.stringify(cache_1.LookupCacheEntryResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceCreateCacheEntryProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.CreateCacheEntryRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.CreateCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.CreateCacheEntry(ctx, request);
-        }
-        return Buffer.from(cache_1.CreateCacheEntryResponse.toBinary(response));
-    });
-}
-function handleCacheServiceFinalizeCacheEntryUploadProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.FinalizeCacheEntryUploadRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.FinalizeCacheEntryUpload(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.FinalizeCacheEntryUpload(ctx, request);
-        }
-        return Buffer.from(cache_1.FinalizeCacheEntryUploadResponse.toBinary(response));
-    });
-}
-function handleCacheServiceGetCacheEntryDownloadURLProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.GetCacheEntryDownloadURLRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.GetCacheEntryDownloadURL(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.GetCacheEntryDownloadURL(ctx, request);
-        }
-        return Buffer.from(cache_1.GetCacheEntryDownloadURLResponse.toBinary(response));
-    });
-}
-function handleCacheServiceDeleteCacheEntryProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.DeleteCacheEntryRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.DeleteCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.DeleteCacheEntry(ctx, request);
-        }
-        return Buffer.from(cache_1.DeleteCacheEntryResponse.toBinary(response));
-    });
-}
-function handleCacheServiceListCacheEntriesProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.ListCacheEntriesRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.ListCacheEntries(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.ListCacheEntries(ctx, request);
-        }
-        return Buffer.from(cache_1.ListCacheEntriesResponse.toBinary(response));
-    });
-}
-function handleCacheServiceLookupCacheEntryProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.LookupCacheEntryRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.LookupCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.LookupCacheEntry(ctx, request);
-        }
-        return Buffer.from(cache_1.LookupCacheEntryResponse.toBinary(response));
-    });
-}
-//# sourceMappingURL=cache.twirp.js.map
-
-/***/ }),
-
-/***/ 3639:
-/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.CacheEntry = void 0;
-const runtime_1 = __nccwpck_require__(4061);
-const runtime_2 = __nccwpck_require__(4061);
-const runtime_3 = __nccwpck_require__(4061);
-const runtime_4 = __nccwpck_require__(4061);
-const runtime_5 = __nccwpck_require__(4061);
-const timestamp_1 = __nccwpck_require__(4469);
-// @generated message type with reflection information, may provide speed optimized methods
-class CacheEntry$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.entities.v1.CacheEntry", [
-            { no: 1, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 2, name: "hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 3, name: "size_bytes", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
-            { no: 4, name: "scope", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 5, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 6, name: "created_at", kind: "message", T: () => timestamp_1.Timestamp },
-            { no: 7, name: "last_accessed_at", kind: "message", T: () => timestamp_1.Timestamp },
-            { no: 8, name: "expires_at", kind: "message", T: () => timestamp_1.Timestamp }
-        ]);
-    }
-    create(value) {
-        const message = { key: "", hash: "", sizeBytes: "0", scope: "", version: "" };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* string key */ 1:
-                    message.key = reader.string();
-                    break;
-                case /* string hash */ 2:
-                    message.hash = reader.string();
-                    break;
-                case /* int64 size_bytes */ 3:
-                    message.sizeBytes = reader.int64().toString();
-                    break;
-                case /* string scope */ 4:
-                    message.scope = reader.string();
-                    break;
-                case /* string version */ 5:
-                    message.version = reader.string();
-                    break;
-                case /* google.protobuf.Timestamp created_at */ 6:
-                    message.createdAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.createdAt);
-                    break;
-                case /* google.protobuf.Timestamp last_accessed_at */ 7:
-                    message.lastAccessedAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.lastAccessedAt);
-                    break;
-                case /* google.protobuf.Timestamp expires_at */ 8:
-                    message.expiresAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.expiresAt);
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* string key = 1; */
-        if (message.key !== "")
-            writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.key);
-        /* string hash = 2; */
-        if (message.hash !== "")
-            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.hash);
-        /* int64 size_bytes = 3; */
-        if (message.sizeBytes !== "0")
-            writer.tag(3, runtime_1.WireType.Varint).int64(message.sizeBytes);
-        /* string scope = 4; */
-        if (message.scope !== "")
-            writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.scope);
-        /* string version = 5; */
-        if (message.version !== "")
-            writer.tag(5, runtime_1.WireType.LengthDelimited).string(message.version);
-        /* google.protobuf.Timestamp created_at = 6; */
-        if (message.createdAt)
-            timestamp_1.Timestamp.internalBinaryWrite(message.createdAt, writer.tag(6, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        /* google.protobuf.Timestamp last_accessed_at = 7; */
-        if (message.lastAccessedAt)
-            timestamp_1.Timestamp.internalBinaryWrite(message.lastAccessedAt, writer.tag(7, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        /* google.protobuf.Timestamp expires_at = 8; */
-        if (message.expiresAt)
-            timestamp_1.Timestamp.internalBinaryWrite(message.expiresAt, writer.tag(8, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.entities.v1.CacheEntry
- */
-exports.CacheEntry = new CacheEntry$Type();
-//# sourceMappingURL=cacheentry.js.map
+//# sourceMappingURL=cache.twirp-client.js.map
 
 /***/ }),
 
@@ -3327,7 +2203,7 @@ const config_1 = __nccwpck_require__(5147);
 const cacheUtils_1 = __nccwpck_require__(1518);
 const auth_1 = __nccwpck_require__(5526);
 const http_client_1 = __nccwpck_require__(6255);
-const cache_twirp_1 = __nccwpck_require__(267);
+const cache_twirp_client_1 = __nccwpck_require__(2655);
 /**
  * This class is a wrapper around the CacheServiceClientJSON class generated by Twirp.
  *
@@ -3464,7 +2340,7 @@ class CacheServiceClient {
 }
 function internalCacheTwirpClient(options) {
     const client = new CacheServiceClient((0, user_agent_1.getUserAgentString)(), options === null || options === void 0 ? void 0 : options.maxAttempts, options === null || options === void 0 ? void 0 : options.retryIntervalMs, options === null || options === void 0 ? void 0 : options.retryMultiplier);
-    return new cache_twirp_1.CacheServiceClientJSON(client);
+    return new cache_twirp_client_1.CacheServiceClientJSON(client);
 }
 exports.internalCacheTwirpClient = internalCacheTwirpClient;
 //# sourceMappingURL=cacheTwirpClient.js.map
@@ -54333,599 +53209,6 @@ DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
 };
 
 
-/***/ }),
-
-/***/ 4365:
-/***/ ((module) => {
-
-"use strict";
-
-
-function _process (v, mod) {
-  var i
-  var r
-
-  if (typeof mod === 'function') {
-    r = mod(v)
-    if (r !== undefined) {
-      v = r
-    }
-  } else if (Array.isArray(mod)) {
-    for (i = 0; i < mod.length; i++) {
-      r = mod[i](v)
-      if (r !== undefined) {
-        v = r
-      }
-    }
-  }
-
-  return v
-}
-
-function parseKey (key, val) {
-  // detect negative index notation
-  if (key[0] === '-' && Array.isArray(val) && /^-\d+$/.test(key)) {
-    return val.length + parseInt(key, 10)
-  }
-  return key
-}
-
-function isIndex (k) {
-  return /^\d+$/.test(k)
-}
-
-function isObject (val) {
-  return Object.prototype.toString.call(val) === '[object Object]'
-}
-
-function isArrayOrObject (val) {
-  return Object(val) === val
-}
-
-function isEmptyObject (val) {
-  return Object.keys(val).length === 0
-}
-
-var blacklist = ['__proto__', 'prototype', 'constructor']
-var blacklistFilter = function (part) { return blacklist.indexOf(part) === -1 }
-
-function parsePath (path, sep) {
-  if (path.indexOf('[') >= 0) {
-    path = path.replace(/\[/g, sep).replace(/]/g, '')
-  }
-
-  var parts = path.split(sep)
-
-  var check = parts.filter(blacklistFilter)
-
-  if (check.length !== parts.length) {
-    throw Error('Refusing to update blacklisted property ' + path)
-  }
-
-  return parts
-}
-
-var hasOwnProperty = Object.prototype.hasOwnProperty
-
-function DotObject (separator, override, useArray, useBrackets) {
-  if (!(this instanceof DotObject)) {
-    return new DotObject(separator, override, useArray, useBrackets)
-  }
-
-  if (typeof override === 'undefined') override = false
-  if (typeof useArray === 'undefined') useArray = true
-  if (typeof useBrackets === 'undefined') useBrackets = true
-  this.separator = separator || '.'
-  this.override = override
-  this.useArray = useArray
-  this.useBrackets = useBrackets
-  this.keepArray = false
-
-  // contains touched arrays
-  this.cleanup = []
-}
-
-var dotDefault = new DotObject('.', false, true, true)
-function wrap (method) {
-  return function () {
-    return dotDefault[method].apply(dotDefault, arguments)
-  }
-}
-
-DotObject.prototype._fill = function (a, obj, v, mod) {
-  var k = a.shift()
-
-  if (a.length > 0) {
-    obj[k] = obj[k] || (this.useArray && isIndex(a[0]) ? [] : {})
-
-    if (!isArrayOrObject(obj[k])) {
-      if (this.override) {
-        obj[k] = {}
-      } else {
-        if (!(isArrayOrObject(v) && isEmptyObject(v))) {
-          throw new Error(
-            'Trying to redefine `' + k + '` which is a ' + typeof obj[k]
-          )
-        }
-
-        return
-      }
-    }
-
-    this._fill(a, obj[k], v, mod)
-  } else {
-    if (!this.override && isArrayOrObject(obj[k]) && !isEmptyObject(obj[k])) {
-      if (!(isArrayOrObject(v) && isEmptyObject(v))) {
-        throw new Error("Trying to redefine non-empty obj['" + k + "']")
-      }
-
-      return
-    }
-
-    obj[k] = _process(v, mod)
-  }
-}
-
-/**
- *
- * Converts an object with dotted-key/value pairs to it's expanded version
- *
- * Optionally transformed by a set of modifiers.
- *
- * Usage:
- *
- *   var row = {
- *     'nr': 200,
- *     'doc.name': '  My Document  '
- *   }
- *
- *   var mods = {
- *     'doc.name': [_s.trim, _s.underscored]
- *   }
- *
- *   dot.object(row, mods)
- *
- * @param {Object} obj
- * @param {Object} mods
- */
-DotObject.prototype.object = function (obj, mods) {
-  var self = this
-
-  Object.keys(obj).forEach(function (k) {
-    var mod = mods === undefined ? null : mods[k]
-    // normalize array notation.
-    var ok = parsePath(k, self.separator).join(self.separator)
-
-    if (ok.indexOf(self.separator) !== -1) {
-      self._fill(ok.split(self.separator), obj, obj[k], mod)
-      delete obj[k]
-    } else {
-      obj[k] = _process(obj[k], mod)
-    }
-  })
-
-  return obj
-}
-
-/**
- * @param {String} path dotted path
- * @param {String} v value to be set
- * @param {Object} obj object to be modified
- * @param {Function|Array} mod optional modifier
- */
-DotObject.prototype.str = function (path, v, obj, mod) {
-  var ok = parsePath(path, this.separator).join(this.separator)
-
-  if (path.indexOf(this.separator) !== -1) {
-    this._fill(ok.split(this.separator), obj, v, mod)
-  } else {
-    obj[path] = _process(v, mod)
-  }
-
-  return obj
-}
-
-/**
- *
- * Pick a value from an object using dot notation.
- *
- * Optionally remove the value
- *
- * @param {String} path
- * @param {Object} obj
- * @param {Boolean} remove
- */
-DotObject.prototype.pick = function (path, obj, remove, reindexArray) {
-  var i
-  var keys
-  var val
-  var key
-  var cp
-
-  keys = parsePath(path, this.separator)
-  for (i = 0; i < keys.length; i++) {
-    key = parseKey(keys[i], obj)
-    if (obj && typeof obj === 'object' && key in obj) {
-      if (i === keys.length - 1) {
-        if (remove) {
-          val = obj[key]
-          if (reindexArray && Array.isArray(obj)) {
-            obj.splice(key, 1)
-          } else {
-            delete obj[key]
-          }
-          if (Array.isArray(obj)) {
-            cp = keys.slice(0, -1).join('.')
-            if (this.cleanup.indexOf(cp) === -1) {
-              this.cleanup.push(cp)
-            }
-          }
-          return val
-        } else {
-          return obj[key]
-        }
-      } else {
-        obj = obj[key]
-      }
-    } else {
-      return undefined
-    }
-  }
-  if (remove && Array.isArray(obj)) {
-    obj = obj.filter(function (n) {
-      return n !== undefined
-    })
-  }
-  return obj
-}
-/**
- *
- * Delete value from an object using dot notation.
- *
- * @param {String} path
- * @param {Object} obj
- * @return {any} The removed value
- */
-DotObject.prototype.delete = function (path, obj) {
-  return this.remove(path, obj, true)
-}
-
-/**
- *
- * Remove value from an object using dot notation.
- *
- * Will remove multiple items if path is an array.
- * In this case array indexes will be retained until all
- * removals have been processed.
- *
- * Use dot.delete() to automatically  re-index arrays.
- *
- * @param {String|Array<String>} path
- * @param {Object} obj
- * @param {Boolean} reindexArray
- * @return {any} The removed value
- */
-DotObject.prototype.remove = function (path, obj, reindexArray) {
-  var i
-
-  this.cleanup = []
-  if (Array.isArray(path)) {
-    for (i = 0; i < path.length; i++) {
-      this.pick(path[i], obj, true, reindexArray)
-    }
-    if (!reindexArray) {
-      this._cleanup(obj)
-    }
-    return obj
-  } else {
-    return this.pick(path, obj, true, reindexArray)
-  }
-}
-
-DotObject.prototype._cleanup = function (obj) {
-  var ret
-  var i
-  var keys
-  var root
-  if (this.cleanup.length) {
-    for (i = 0; i < this.cleanup.length; i++) {
-      keys = this.cleanup[i].split('.')
-      root = keys.splice(0, -1).join('.')
-      ret = root ? this.pick(root, obj) : obj
-      ret = ret[keys[0]].filter(function (v) {
-        return v !== undefined
-      })
-      this.set(this.cleanup[i], ret, obj)
-    }
-    this.cleanup = []
-  }
-}
-
-/**
- * Alias method  for `dot.remove`
- *
- * Note: this is not an alias for dot.delete()
- *
- * @param {String|Array<String>} path
- * @param {Object} obj
- * @param {Boolean} reindexArray
- * @return {any} The removed value
- */
-DotObject.prototype.del = DotObject.prototype.remove
-
-/**
- *
- * Move a property from one place to the other.
- *
- * If the source path does not exist (undefined)
- * the target property will not be set.
- *
- * @param {String} source
- * @param {String} target
- * @param {Object} obj
- * @param {Function|Array} mods
- * @param {Boolean} merge
- */
-DotObject.prototype.move = function (source, target, obj, mods, merge) {
-  if (typeof mods === 'function' || Array.isArray(mods)) {
-    this.set(target, _process(this.pick(source, obj, true), mods), obj, merge)
-  } else {
-    merge = mods
-    this.set(target, this.pick(source, obj, true), obj, merge)
-  }
-
-  return obj
-}
-
-/**
- *
- * Transfer a property from one object to another object.
- *
- * If the source path does not exist (undefined)
- * the property on the other object will not be set.
- *
- * @param {String} source
- * @param {String} target
- * @param {Object} obj1
- * @param {Object} obj2
- * @param {Function|Array} mods
- * @param {Boolean} merge
- */
-DotObject.prototype.transfer = function (
-  source,
-  target,
-  obj1,
-  obj2,
-  mods,
-  merge
-) {
-  if (typeof mods === 'function' || Array.isArray(mods)) {
-    this.set(
-      target,
-      _process(this.pick(source, obj1, true), mods),
-      obj2,
-      merge
-    )
-  } else {
-    merge = mods
-    this.set(target, this.pick(source, obj1, true), obj2, merge)
-  }
-
-  return obj2
-}
-
-/**
- *
- * Copy a property from one object to another object.
- *
- * If the source path does not exist (undefined)
- * the property on the other object will not be set.
- *
- * @param {String} source
- * @param {String} target
- * @param {Object} obj1
- * @param {Object} obj2
- * @param {Function|Array} mods
- * @param {Boolean} merge
- */
-DotObject.prototype.copy = function (source, target, obj1, obj2, mods, merge) {
-  if (typeof mods === 'function' || Array.isArray(mods)) {
-    this.set(
-      target,
-      _process(
-        // clone what is picked
-        JSON.parse(JSON.stringify(this.pick(source, obj1, false))),
-        mods
-      ),
-      obj2,
-      merge
-    )
-  } else {
-    merge = mods
-    this.set(target, this.pick(source, obj1, false), obj2, merge)
-  }
-
-  return obj2
-}
-
-/**
- *
- * Set a property on an object using dot notation.
- *
- * @param {String} path
- * @param {any} val
- * @param {Object} obj
- * @param {Boolean} merge
- */
-DotObject.prototype.set = function (path, val, obj, merge) {
-  var i
-  var k
-  var keys
-  var key
-
-  // Do not operate if the value is undefined.
-  if (typeof val === 'undefined') {
-    return obj
-  }
-  keys = parsePath(path, this.separator)
-
-  for (i = 0; i < keys.length; i++) {
-    key = keys[i]
-    if (i === keys.length - 1) {
-      if (merge && isObject(val) && isObject(obj[key])) {
-        for (k in val) {
-          if (hasOwnProperty.call(val, k)) {
-            obj[key][k] = val[k]
-          }
-        }
-      } else if (merge && Array.isArray(obj[key]) && Array.isArray(val)) {
-        for (var j = 0; j < val.length; j++) {
-          obj[keys[i]].push(val[j])
-        }
-      } else {
-        obj[key] = val
-      }
-    } else if (
-      // force the value to be an object
-      !hasOwnProperty.call(obj, key) ||
-      (!isObject(obj[key]) && !Array.isArray(obj[key]))
-    ) {
-      // initialize as array if next key is numeric
-      if (/^\d+$/.test(keys[i + 1])) {
-        obj[key] = []
-      } else {
-        obj[key] = {}
-      }
-    }
-    obj = obj[key]
-  }
-  return obj
-}
-
-/**
- *
- * Transform an object
- *
- * Usage:
- *
- *   var obj = {
- *     "id": 1,
- *    "some": {
- *      "thing": "else"
- *    }
- *   }
- *
- *   var transform = {
- *     "id": "nr",
- *    "some.thing": "name"
- *   }
- *
- *   var tgt = dot.transform(transform, obj)
- *
- * @param {Object} recipe Transform recipe
- * @param {Object} obj Object to be transformed
- * @param {Array} mods modifiers for the target
- */
-DotObject.prototype.transform = function (recipe, obj, tgt) {
-  obj = obj || {}
-  tgt = tgt || {}
-  Object.keys(recipe).forEach(
-    function (key) {
-      this.set(recipe[key], this.pick(key, obj), tgt)
-    }.bind(this)
-  )
-  return tgt
-}
-
-/**
- *
- * Convert object to dotted-key/value pair
- *
- * Usage:
- *
- *   var tgt = dot.dot(obj)
- *
- *   or
- *
- *   var tgt = {}
- *   dot.dot(obj, tgt)
- *
- * @param {Object} obj source object
- * @param {Object} tgt target object
- * @param {Array} path path array (internal)
- */
-DotObject.prototype.dot = function (obj, tgt, path) {
-  tgt = tgt || {}
-  path = path || []
-  var isArray = Array.isArray(obj)
-
-  Object.keys(obj).forEach(
-    function (key) {
-      var index = isArray && this.useBrackets ? '[' + key + ']' : key
-      if (
-        isArrayOrObject(obj[key]) &&
-        ((isObject(obj[key]) && !isEmptyObject(obj[key])) ||
-          (Array.isArray(obj[key]) && !this.keepArray && obj[key].length !== 0))
-      ) {
-        if (isArray && this.useBrackets) {
-          var previousKey = path[path.length - 1] || ''
-          return this.dot(
-            obj[key],
-            tgt,
-            path.slice(0, -1).concat(previousKey + index)
-          )
-        } else {
-          return this.dot(obj[key], tgt, path.concat(index))
-        }
-      } else {
-        if (isArray && this.useBrackets) {
-          tgt[path.join(this.separator).concat('[' + key + ']')] = obj[key]
-        } else {
-          tgt[path.concat(index).join(this.separator)] = obj[key]
-        }
-      }
-    }.bind(this)
-  )
-  return tgt
-}
-
-DotObject.pick = wrap('pick')
-DotObject.move = wrap('move')
-DotObject.transfer = wrap('transfer')
-DotObject.transform = wrap('transform')
-DotObject.copy = wrap('copy')
-DotObject.object = wrap('object')
-DotObject.str = wrap('str')
-DotObject.set = wrap('set')
-DotObject.delete = wrap('delete')
-DotObject.del = DotObject.remove = wrap('remove')
-DotObject.dot = wrap('dot');
-['override', 'overwrite'].forEach(function (prop) {
-  Object.defineProperty(DotObject, prop, {
-    get: function () {
-      return dotDefault.override
-    },
-    set: function (val) {
-      dotDefault.override = !!val
-    }
-  })
-});
-['useArray', 'keepArray', 'useBrackets'].forEach(function (prop) {
-  Object.defineProperty(DotObject, prop, {
-    get: function () {
-      return dotDefault[prop]
-    },
-    set: function (val) {
-      dotDefault[prop] = val
-    }
-  })
-})
-
-DotObject._process = _process
-
-module.exports = DotObject
-
-
 /***/ }),
 
 /***/ 7426:
@@ -60380,1152 +58663,6 @@ if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
 exports.debug = debug; // for test
 
 
-/***/ }),
-
-/***/ 1524:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-
-
-/***/ }),
-
-/***/ 6647:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.isValidErrorCode = exports.httpStatusFromErrorCode = exports.TwirpErrorCode = exports.BadRouteError = exports.InternalServerErrorWith = exports.InternalServerError = exports.RequiredArgumentError = exports.InvalidArgumentError = exports.NotFoundError = exports.TwirpError = void 0;
-/**
- * Represents a twirp error
- */
-class TwirpError extends Error {
-    constructor(code, msg) {
-        super(msg);
-        this.code = TwirpErrorCode.Internal;
-        this.meta = {};
-        this.code = code;
-        this.msg = msg;
-        Object.setPrototypeOf(this, TwirpError.prototype);
-    }
-    /**
-     * Adds a metadata kv to the error
-     * @param key
-     * @param value
-     */
-    withMeta(key, value) {
-        this.meta[key] = value;
-        return this;
-    }
-    /**
-     * Returns a single metadata value
-     * return "" if not found
-     * @param key
-     */
-    getMeta(key) {
-        return this.meta[key] || "";
-    }
-    /**
-     * Add the original error cause
-     * @param err
-     * @param addMeta
-     */
-    withCause(err, addMeta = false) {
-        this._originalCause = err;
-        if (addMeta) {
-            this.withMeta("cause", err.message);
-        }
-        return this;
-    }
-    cause() {
-        return this._originalCause;
-    }
-    /**
-     * Returns the error representation to JSON
-     */
-    toJSON() {
-        try {
-            return JSON.stringify({
-                code: this.code,
-                msg: this.msg,
-                meta: this.meta,
-            });
-        }
-        catch (e) {
-            return `{"code": "internal", "msg": "There was an error but it could not be serialized into JSON"}`;
-        }
-    }
-    /**
-     * Create a twirp error from an object
-     * @param obj
-     */
-    static fromObject(obj) {
-        const code = obj["code"] || TwirpErrorCode.Unknown;
-        const msg = obj["msg"] || "unknown";
-        const error = new TwirpError(code, msg);
-        if (obj["meta"]) {
-            Object.keys(obj["meta"]).forEach((key) => {
-                error.withMeta(key, obj["meta"][key]);
-            });
-        }
-        return error;
-    }
-}
-exports.TwirpError = TwirpError;
-/**
- * NotFoundError constructor for the common NotFound error.
- */
-class NotFoundError extends TwirpError {
-    constructor(msg) {
-        super(TwirpErrorCode.NotFound, msg);
-    }
-}
-exports.NotFoundError = NotFoundError;
-/**
- * InvalidArgumentError constructor for the common InvalidArgument error. Can be
- * used when an argument has invalid format, is a number out of range, is a bad
- * option, etc).
- */
-class InvalidArgumentError extends TwirpError {
-    constructor(argument, validationMsg) {
-        super(TwirpErrorCode.InvalidArgument, argument + " " + validationMsg);
-        this.withMeta("argument", argument);
-    }
-}
-exports.InvalidArgumentError = InvalidArgumentError;
-/**
- * RequiredArgumentError is a more specific constructor for InvalidArgument
- * error. Should be used when the argument is required (expected to have a
- * non-zero value).
- */
-class RequiredArgumentError extends InvalidArgumentError {
-    constructor(argument) {
-        super(argument, "is required");
-    }
-}
-exports.RequiredArgumentError = RequiredArgumentError;
-/**
- * InternalError constructor for the common Internal error. Should be used to
- * specify that something bad or unexpected happened.
- */
-class InternalServerError extends TwirpError {
-    constructor(msg) {
-        super(TwirpErrorCode.Internal, msg);
-    }
-}
-exports.InternalServerError = InternalServerError;
-/**
- * InternalErrorWith makes an internal error, wrapping the original error and using it
- * for the error message, and with metadata "cause" with the original error type.
- * This function is used by Twirp services to wrap non-Twirp errors as internal errors.
- * The wrapped error can be extracted later with err.cause()
- */
-class InternalServerErrorWith extends InternalServerError {
-    constructor(err) {
-        super(err.message);
-        this.withMeta("cause", err.name);
-        this.withCause(err);
-    }
-}
-exports.InternalServerErrorWith = InternalServerErrorWith;
-/**
- * A standard BadRoute Error
- */
-class BadRouteError extends TwirpError {
-    constructor(msg, method, url) {
-        super(TwirpErrorCode.BadRoute, msg);
-        this.withMeta("twirp_invalid_route", method + " " + url);
-    }
-}
-exports.BadRouteError = BadRouteError;
-var TwirpErrorCode;
-(function (TwirpErrorCode) {
-    // Canceled indicates the operation was cancelled (typically by the caller).
-    TwirpErrorCode["Canceled"] = "canceled";
-    // Unknown error. For example when handling errors raised by APIs that do not
-    // return enough error information.
-    TwirpErrorCode["Unknown"] = "unknown";
-    // InvalidArgument indicates client specified an invalid argument. It
-    // indicates arguments that are problematic regardless of the state of the
-    // system (i.e. a malformed file name, required argument, number out of range,
-    // etc.).
-    TwirpErrorCode["InvalidArgument"] = "invalid_argument";
-    // Malformed indicates an error occurred while decoding the client's request.
-    // This may mean that the message was encoded improperly, or that there is a
-    // disagreement in message format between the client and server.
-    TwirpErrorCode["Malformed"] = "malformed";
-    // DeadlineExceeded means operation expired before completion. For operations
-    // that change the state of the system, this error may be returned even if the
-    // operation has completed successfully (timeout).
-    TwirpErrorCode["DeadlineExceeded"] = "deadline_exceeded";
-    // NotFound means some requested entity was not found.
-    TwirpErrorCode["NotFound"] = "not_found";
-    // BadRoute means that the requested URL path wasn't routable to a Twirp
-    // service and method. This is returned by the generated server, and usually
-    // shouldn't be returned by applications. Instead, applications should use
-    // NotFound or Unimplemented.
-    TwirpErrorCode["BadRoute"] = "bad_route";
-    // AlreadyExists means an attempt to create an entity failed because one
-    // already exists.
-    TwirpErrorCode["AlreadyExists"] = "already_exists";
-    // PermissionDenied indicates the caller does not have permission to execute
-    // the specified operation. It must not be used if the caller cannot be
-    // identified (Unauthenticated).
-    TwirpErrorCode["PermissionDenied"] = "permission_denied";
-    // Unauthenticated indicates the request does not have valid authentication
-    // credentials for the operation.
-    TwirpErrorCode["Unauthenticated"] = "unauthenticated";
-    // ResourceExhausted indicates some resource has been exhausted, perhaps a
-    // per-user quota, or perhaps the entire file system is out of space.
-    TwirpErrorCode["ResourceExhausted"] = "resource_exhausted";
-    // FailedPrecondition indicates operation was rejected because the system is
-    // not in a state required for the operation's execution. For example, doing
-    // an rmdir operation on a directory that is non-empty, or on a non-directory
-    // object, or when having conflicting read-modify-write on the same resource.
-    TwirpErrorCode["FailedPrecondition"] = "failed_precondition";
-    // Aborted indicates the operation was aborted, typically due to a concurrency
-    // issue like sequencer check failures, transaction aborts, etc.
-    TwirpErrorCode["Aborted"] = "aborted";
-    // OutOfRange means operation was attempted past the valid range. For example,
-    // seeking or reading past end of a paginated collection.
-    //
-    // Unlike InvalidArgument, this error indicates a problem that may be fixed if
-    // the system state changes (i.e. adding more items to the collection).
-    //
-    // There is a fair bit of overlap between FailedPrecondition and OutOfRange.
-    // We recommend using OutOfRange (the more specific error) when it applies so
-    // that callers who are iterating through a space can easily look for an
-    // OutOfRange error to detect when they are done.
-    TwirpErrorCode["OutOfRange"] = "out_of_range";
-    // Unimplemented indicates operation is not implemented or not
-    // supported/enabled in this service.
-    TwirpErrorCode["Unimplemented"] = "unimplemented";
-    // Internal errors. When some invariants expected by the underlying system
-    // have been broken. In other words, something bad happened in the library or
-    // backend service. Do not confuse with HTTP Internal Server Error; an
-    // Internal error could also happen on the client code, i.e. when parsing a
-    // server response.
-    TwirpErrorCode["Internal"] = "internal";
-    // Unavailable indicates the service is currently unavailable. This is a most
-    // likely a transient condition and may be corrected by retrying with a
-    // backoff.
-    TwirpErrorCode["Unavailable"] = "unavailable";
-    // DataLoss indicates unrecoverable data loss or corruption.
-    TwirpErrorCode["DataLoss"] = "data_loss";
-})(TwirpErrorCode = exports.TwirpErrorCode || (exports.TwirpErrorCode = {}));
-// ServerHTTPStatusFromErrorCode maps a Twirp error type into a similar HTTP
-// response status. It is used by the Twirp server handler to set the HTTP
-// response status code. Returns 0 if the ErrorCode is invalid.
-function httpStatusFromErrorCode(code) {
-    switch (code) {
-        case TwirpErrorCode.Canceled:
-            return 408; // RequestTimeout
-        case TwirpErrorCode.Unknown:
-            return 500; // Internal Server Error
-        case TwirpErrorCode.InvalidArgument:
-            return 400; // BadRequest
-        case TwirpErrorCode.Malformed:
-            return 400; // BadRequest
-        case TwirpErrorCode.DeadlineExceeded:
-            return 408; // RequestTimeout
-        case TwirpErrorCode.NotFound:
-            return 404; // Not Found
-        case TwirpErrorCode.BadRoute:
-            return 404; // Not Found
-        case TwirpErrorCode.AlreadyExists:
-            return 409; // Conflict
-        case TwirpErrorCode.PermissionDenied:
-            return 403; // Forbidden
-        case TwirpErrorCode.Unauthenticated:
-            return 401; // Unauthorized
-        case TwirpErrorCode.ResourceExhausted:
-            return 429; // Too Many Requests
-        case TwirpErrorCode.FailedPrecondition:
-            return 412; // Precondition Failed
-        case TwirpErrorCode.Aborted:
-            return 409; // Conflict
-        case TwirpErrorCode.OutOfRange:
-            return 400; // Bad Request
-        case TwirpErrorCode.Unimplemented:
-            return 501; // Not Implemented
-        case TwirpErrorCode.Internal:
-            return 500; // Internal Server Error
-        case TwirpErrorCode.Unavailable:
-            return 503; // Service Unavailable
-        case TwirpErrorCode.DataLoss:
-            return 500; // Internal Server Error
-        default:
-            return 0; // Invalid!
-    }
-}
-exports.httpStatusFromErrorCode = httpStatusFromErrorCode;
-// IsValidErrorCode returns true if is one of the valid predefined constants.
-function isValidErrorCode(code) {
-    return httpStatusFromErrorCode(code) != 0;
-}
-exports.isValidErrorCode = isValidErrorCode;
-
-
-/***/ }),
-
-/***/ 6748:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
-
-"use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __rest = (this && this.__rest) || function (s, e) {
-    var t = {};
-    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
-        t[p] = s[p];
-    if (s != null && typeof Object.getOwnPropertySymbols === "function")
-        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
-            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
-                t[p[i]] = s[p[i]];
-        }
-    return t;
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.Gateway = exports.Pattern = void 0;
-const querystring_1 = __nccwpck_require__(3477);
-const dotObject = __importStar(__nccwpck_require__(4365));
-const request_1 = __nccwpck_require__(8347);
-const errors_1 = __nccwpck_require__(6647);
-const http_client_1 = __nccwpck_require__(4091);
-const server_1 = __nccwpck_require__(6604);
-var Pattern;
-(function (Pattern) {
-    Pattern["POST"] = "post";
-    Pattern["GET"] = "get";
-    Pattern["PATCH"] = "patch";
-    Pattern["PUT"] = "put";
-    Pattern["DELETE"] = "delete";
-})(Pattern = exports.Pattern || (exports.Pattern = {}));
-/**
- * The Gateway proxies http requests to Twirp Compliant
- * handlers
- */
-class Gateway {
-    constructor(routes) {
-        this.routes = routes;
-    }
-    /**
-     * Middleware that rewrite the current request
-     * to a Twirp compliant request
-     */
-    twirpRewrite(prefix = "/twirp") {
-        return (req, resp, next) => {
-            this.rewrite(req, resp, prefix)
-                .then(() => next())
-                .catch((e) => {
-                if (e instanceof errors_1.TwirpError) {
-                    if (e.code !== errors_1.TwirpErrorCode.NotFound) {
-                        server_1.writeError(resp, e);
-                    }
-                    else {
-                        next();
-                    }
-                }
-            });
-        };
-    }
-    /**
-     * Rewrite an incoming request to a Twirp compliant request
-     * @param req
-     * @param resp
-     * @param prefix
-     */
-    rewrite(req, resp, prefix = "/twirp") {
-        return __awaiter(this, void 0, void 0, function* () {
-            const [match, route] = this.matchRoute(req);
-            const body = yield this.prepareTwirpBody(req, match, route);
-            const twirpUrl = `${prefix}/${route.packageName}.${route.serviceName}/${route.methodName}`;
-            req.url = twirpUrl;
-            req.originalUrl = twirpUrl;
-            req.method = "POST";
-            req.headers["content-type"] = "application/json";
-            req.rawBody = Buffer.from(JSON.stringify(body));
-            if (route.responseBodyKey) {
-                const endFn = resp.end.bind(resp);
-                resp.end = function (chunk) {
-                    if (resp.statusCode === 200) {
-                        endFn(`{ "${route.responseBodyKey}": ${chunk} }`);
-                    }
-                    else {
-                        endFn(chunk);
-                    }
-                };
-            }
-        });
-    }
-    /**
-     * Create a reverse proxy handler to
-     * proxy http requests to Twirp Compliant handlers
-     * @param httpClientOption
-     */
-    reverseProxy(httpClientOption) {
-        const client = http_client_1.NodeHttpRPC(httpClientOption);
-        return (req, res) => __awaiter(this, void 0, void 0, function* () {
-            try {
-                const [match, route] = this.matchRoute(req);
-                const body = yield this.prepareTwirpBody(req, match, route);
-                const response = yield client.request(`${route.packageName}.${route.serviceName}`, route.methodName, "application/json", body);
-                res.statusCode = 200;
-                res.setHeader("content-type", "application/json");
-                let jsonResponse;
-                if (route.responseBodyKey) {
-                    jsonResponse = JSON.stringify({ [route.responseBodyKey]: response });
-                }
-                else {
-                    jsonResponse = JSON.stringify(response);
-                }
-                res.end(jsonResponse);
-            }
-            catch (e) {
-                server_1.writeError(res, e);
-            }
-        });
-    }
-    /**
-     * Prepares twirp body requests using http.google.annotions
-     * compliant spec
-     *
-     * @param req
-     * @param match
-     * @param route
-     * @protected
-     */
-    prepareTwirpBody(req, match, route) {
-        return __awaiter(this, void 0, void 0, function* () {
-            const _a = match.params, { query_string } = _a, params = __rest(_a, ["query_string"]);
-            let requestBody = Object.assign({}, params);
-            if (query_string && route.bodyKey !== "*") {
-                const queryParams = this.parseQueryString(query_string);
-                requestBody = Object.assign(Object.assign({}, queryParams), requestBody);
-            }
-            let body = {};
-            if (route.bodyKey) {
-                const data = yield request_1.getRequestData(req);
-                try {
-                    const jsonBody = JSON.parse(data.toString() || "{}");
-                    if (route.bodyKey === "*") {
-                        body = jsonBody;
-                    }
-                    else {
-                        body[route.bodyKey] = jsonBody;
-                    }
-                }
-                catch (e) {
-                    const msg = "the json request could not be decoded";
-                    throw new errors_1.TwirpError(errors_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-                }
-            }
-            return Object.assign(Object.assign({}, body), requestBody);
-        });
-    }
-    /**
-     * Matches a route
-     * @param req
-     */
-    matchRoute(req) {
-        var _a;
-        const httpMethod = (_a = req.method) === null || _a === void 0 ? void 0 : _a.toLowerCase();
-        if (!httpMethod) {
-            throw new errors_1.BadRouteError(`method not allowed`, req.method || "", req.url || "");
-        }
-        const routes = this.routes[httpMethod];
-        for (const route of routes) {
-            const match = route.matcher(req.url || "/");
-            if (match) {
-                return [match, route];
-            }
-        }
-        throw new errors_1.NotFoundError(`url ${req.url} not found`);
-    }
-    /**
-     * Parse query string
-     * @param queryString
-     */
-    parseQueryString(queryString) {
-        const queryParams = querystring_1.parse(queryString.replace("?", ""));
-        return dotObject.object(queryParams);
-    }
-}
-exports.Gateway = Gateway;
-
-
-/***/ }),
-
-/***/ 4263:
-/***/ (function(__unused_webpack_module, exports) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.isHook = exports.chainHooks = void 0;
-// ChainHooks creates a new ServerHook which chains the callbacks in
-// each of the constituent hooks passed in. Each hook function will be
-// called in the order of the ServerHooks values passed in.
-//
-// For the erroring hooks, RequestReceived and RequestRouted, any returned
-// errors prevent processing by later hooks.
-function chainHooks(...hooks) {
-    if (hooks.length === 0) {
-        return null;
-    }
-    if (hooks.length === 1) {
-        return hooks[0];
-    }
-    const serverHook = {
-        requestReceived(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.requestReceived) {
-                        continue;
-                    }
-                    yield hook.requestReceived(ctx);
-                }
-            });
-        },
-        requestPrepared(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.requestPrepared) {
-                        continue;
-                    }
-                    console.warn("hook requestPrepared is deprecated and will be removed in the next release. " +
-                        "Please use responsePrepared instead.");
-                    yield hook.requestPrepared(ctx);
-                }
-            });
-        },
-        responsePrepared(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.responsePrepared) {
-                        continue;
-                    }
-                    yield hook.responsePrepared(ctx);
-                }
-            });
-        },
-        requestSent(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.requestSent) {
-                        continue;
-                    }
-                    console.warn("hook requestSent is deprecated and will be removed in the next release. " +
-                        "Please use responseSent instead.");
-                    yield hook.requestSent(ctx);
-                }
-            });
-        },
-        responseSent(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.responseSent) {
-                        continue;
-                    }
-                    yield hook.responseSent(ctx);
-                }
-            });
-        },
-        requestRouted(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.requestRouted) {
-                        continue;
-                    }
-                    yield hook.requestRouted(ctx);
-                }
-            });
-        },
-        error(ctx, err) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.error) {
-                        continue;
-                    }
-                    yield hook.error(ctx, err);
-                }
-            });
-        },
-    };
-    return serverHook;
-}
-exports.chainHooks = chainHooks;
-function isHook(object) {
-    return ("requestReceived" in object ||
-        "requestPrepared" in object ||
-        "requestSent" in object ||
-        "requestRouted" in object ||
-        "responsePrepared" in object ||
-        "responseSent" in object ||
-        "error" in object);
-}
-exports.isHook = isHook;
-
-
-/***/ }),
-
-/***/ 4091:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
-
-"use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.FetchRPC = exports.wrapErrorResponseToTwirpError = exports.NodeHttpRPC = void 0;
-const http = __importStar(__nccwpck_require__(3685));
-const https = __importStar(__nccwpck_require__(5687));
-const url_1 = __nccwpck_require__(7310);
-const errors_1 = __nccwpck_require__(6647);
-/**
- * a node HTTP RPC implementation
- * @param options
- * @constructor
- */
-const NodeHttpRPC = (options) => ({
-    request(service, method, contentType, data) {
-        let client;
-        return new Promise((resolve, rejected) => {
-            const responseChunks = [];
-            const requestData = contentType === "application/protobuf"
-                ? Buffer.from(data)
-                : JSON.stringify(data);
-            const url = new url_1.URL(options.baseUrl);
-            const isHttps = url.protocol === "https:";
-            if (isHttps) {
-                client = https;
-            }
-            else {
-                client = http;
-            }
-            const prefix = url.pathname !== "/" ? url.pathname : "";
-            const req = client
-                .request(Object.assign(Object.assign({}, (options ? options : {})), { method: "POST", protocol: url.protocol, host: url.hostname, port: url.port ? url.port : isHttps ? 443 : 80, path: `${prefix}/${service}/${method}`, headers: Object.assign(Object.assign({}, (options.headers ? options.headers : {})), { "Content-Type": contentType, "Content-Length": contentType === "application/protobuf"
-                        ? Buffer.byteLength(requestData)
-                        : Buffer.from(requestData).byteLength }) }), (res) => {
-                res.on("data", (chunk) => responseChunks.push(chunk));
-                res.on("end", () => {
-                    const data = Buffer.concat(responseChunks);
-                    if (res.statusCode != 200) {
-                        rejected(wrapErrorResponseToTwirpError(data.toString()));
-                    }
-                    else {
-                        if (contentType === "application/json") {
-                            resolve(JSON.parse(data.toString()));
-                        }
-                        else {
-                            resolve(data);
-                        }
-                    }
-                });
-                res.on("error", (err) => {
-                    rejected(err);
-                });
-            })
-                .on("error", (err) => {
-                rejected(err);
-            });
-            req.end(requestData);
-        });
-    },
-});
-exports.NodeHttpRPC = NodeHttpRPC;
-function wrapErrorResponseToTwirpError(errorResponse) {
-    return errors_1.TwirpError.fromObject(JSON.parse(errorResponse));
-}
-exports.wrapErrorResponseToTwirpError = wrapErrorResponseToTwirpError;
-/**
- * a browser fetch RPC implementation
- */
-const FetchRPC = (options) => ({
-    request(service, method, contentType, data) {
-        return __awaiter(this, void 0, void 0, function* () {
-            const headers = new Headers(options.headers);
-            headers.set("content-type", contentType);
-            const response = yield fetch(`${options.baseUrl}/${service}/${method}`, Object.assign(Object.assign({}, options), { method: "POST", headers, body: data instanceof Uint8Array ? data : JSON.stringify(data) }));
-            if (response.status === 200) {
-                if (contentType === "application/json") {
-                    return yield response.json();
-                }
-                return new Uint8Array(yield response.arrayBuffer());
-            }
-            throw errors_1.TwirpError.fromObject(yield response.json());
-        });
-    },
-});
-exports.FetchRPC = FetchRPC;
-
-
-/***/ }),
-
-/***/ 6465:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
-
-"use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.TwirpContentType = void 0;
-__exportStar(__nccwpck_require__(1524), exports);
-__exportStar(__nccwpck_require__(6604), exports);
-__exportStar(__nccwpck_require__(8913), exports);
-__exportStar(__nccwpck_require__(4263), exports);
-__exportStar(__nccwpck_require__(6647), exports);
-__exportStar(__nccwpck_require__(6748), exports);
-__exportStar(__nccwpck_require__(4091), exports);
-var request_1 = __nccwpck_require__(8347);
-Object.defineProperty(exports, "TwirpContentType", ({ enumerable: true, get: function () { return request_1.TwirpContentType; } }));
-
-
-/***/ }),
-
-/***/ 8913:
-/***/ (function(__unused_webpack_module, exports) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.chainInterceptors = void 0;
-// chains multiple Interceptors into a single Interceptor.
-// The first interceptor wraps the second one, and so on.
-// Returns null if interceptors is empty.
-function chainInterceptors(...interceptors) {
-    if (interceptors.length === 0) {
-        return;
-    }
-    if (interceptors.length === 1) {
-        return interceptors[0];
-    }
-    const first = interceptors[0];
-    return (ctx, request, handler) => __awaiter(this, void 0, void 0, function* () {
-        let next = handler;
-        for (let i = interceptors.length - 1; i > 0; i--) {
-            next = ((next) => (ctx, typedRequest) => {
-                return interceptors[i](ctx, typedRequest, next);
-            })(next);
-        }
-        return first(ctx, request, next);
-    });
-}
-exports.chainInterceptors = chainInterceptors;
-
-
-/***/ }),
-
-/***/ 8347:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.parseTwirpPath = exports.getRequestData = exports.validateRequest = exports.getContentType = exports.TwirpContentType = void 0;
-const errors_1 = __nccwpck_require__(6647);
-/**
- * Supported Twirp Content-Type
- */
-var TwirpContentType;
-(function (TwirpContentType) {
-    TwirpContentType[TwirpContentType["Protobuf"] = 0] = "Protobuf";
-    TwirpContentType[TwirpContentType["JSON"] = 1] = "JSON";
-    TwirpContentType[TwirpContentType["Unknown"] = 2] = "Unknown";
-})(TwirpContentType = exports.TwirpContentType || (exports.TwirpContentType = {}));
-/**
- * Get supported content-type
- * @param mimeType
- */
-function getContentType(mimeType) {
-    switch (mimeType) {
-        case "application/protobuf":
-            return TwirpContentType.Protobuf;
-        case "application/json":
-            return TwirpContentType.JSON;
-        default:
-            return TwirpContentType.Unknown;
-    }
-}
-exports.getContentType = getContentType;
-/**
- * Validate a twirp request
- * @param ctx
- * @param request
- * @param pathPrefix
- */
-function validateRequest(ctx, request, pathPrefix) {
-    if (request.method !== "POST") {
-        const msg = `unsupported method ${request.method} (only POST is allowed)`;
-        throw new errors_1.BadRouteError(msg, request.method || "", request.url || "");
-    }
-    const path = parseTwirpPath(request.url || "");
-    if (path.pkgService !==
-        (ctx.packageName ? ctx.packageName + "." : "") + ctx.serviceName) {
-        const msg = `no handler for path ${request.url}`;
-        throw new errors_1.BadRouteError(msg, request.method || "", request.url || "");
-    }
-    if (path.prefix !== pathPrefix) {
-        const msg = `invalid path prefix ${path.prefix}, expected ${pathPrefix}, on path ${request.url}`;
-        throw new errors_1.BadRouteError(msg, request.method || "", request.url || "");
-    }
-    const mimeContentType = request.headers["content-type"] || "";
-    if (ctx.contentType === TwirpContentType.Unknown) {
-        const msg = `unexpected Content-Type: ${request.headers["content-type"]}`;
-        throw new errors_1.BadRouteError(msg, request.method || "", request.url || "");
-    }
-    return Object.assign(Object.assign({}, path), { mimeContentType, contentType: ctx.contentType });
-}
-exports.validateRequest = validateRequest;
-/**
- * Get request data from the body
- * @param req
- */
-function getRequestData(req) {
-    return new Promise((resolve, reject) => {
-        const reqWithRawBody = req;
-        if (reqWithRawBody.rawBody instanceof Buffer) {
-            resolve(reqWithRawBody.rawBody);
-            return;
-        }
-        const chunks = [];
-        req.on("data", (chunk) => chunks.push(chunk));
-        req.on("end", () => __awaiter(this, void 0, void 0, function* () {
-            const data = Buffer.concat(chunks);
-            resolve(data);
-        }));
-        req.on("error", (err) => {
-            if (req.aborted) {
-                reject(new errors_1.TwirpError(errors_1.TwirpErrorCode.DeadlineExceeded, "failed to read request: deadline exceeded"));
-            }
-            else {
-                reject(new errors_1.TwirpError(errors_1.TwirpErrorCode.Malformed, err.message).withCause(err));
-            }
-        });
-        req.on("close", () => {
-            reject(new errors_1.TwirpError(errors_1.TwirpErrorCode.Canceled, "failed to read request: context canceled"));
-        });
-    });
-}
-exports.getRequestData = getRequestData;
-/**
- * Parses twirp url path
- * @param path
- */
-function parseTwirpPath(path) {
-    const parts = path.split("/");
-    if (parts.length < 2) {
-        return {
-            pkgService: "",
-            method: "",
-            prefix: "",
-        };
-    }
-    return {
-        method: parts[parts.length - 1],
-        pkgService: parts[parts.length - 2],
-        prefix: parts.slice(0, parts.length - 2).join("/"),
-    };
-}
-exports.parseTwirpPath = parseTwirpPath;
-
-
-/***/ }),
-
-/***/ 6604:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.writeError = exports.TwirpServer = void 0;
-const hooks_1 = __nccwpck_require__(4263);
-const request_1 = __nccwpck_require__(8347);
-const errors_1 = __nccwpck_require__(6647);
-/**
- * Runtime server implementation of a TwirpServer
- */
-class TwirpServer {
-    constructor(options) {
-        this.pathPrefix = "/twirp";
-        this.hooks = [];
-        this.interceptors = [];
-        this.packageName = options.packageName;
-        this.serviceName = options.serviceName;
-        this.methodList = options.methodList;
-        this.matchRoute = options.matchRoute;
-        this.service = options.service;
-    }
-    /**
-     * Returns the prefix for this server
-     */
-    get prefix() {
-        return this.pathPrefix;
-    }
-    /**
-     * The http handler for twirp complaint endpoints
-     * @param options
-     */
-    httpHandler(options) {
-        return (req, resp) => {
-            // setup prefix
-            if ((options === null || options === void 0 ? void 0 : options.prefix) !== undefined) {
-                this.withPrefix(options.prefix);
-            }
-            return this._httpHandler(req, resp);
-        };
-    }
-    /**
-     * Adds interceptors or hooks to the request stack
-     * @param middlewares
-     */
-    use(...middlewares) {
-        middlewares.forEach((middleware) => {
-            if (hooks_1.isHook(middleware)) {
-                this.hooks.push(middleware);
-                return this;
-            }
-            this.interceptors.push(middleware);
-        });
-        return this;
-    }
-    /**
-     * Adds a prefix to the service url path
-     * @param prefix
-     */
-    withPrefix(prefix) {
-        if (prefix === false) {
-            this.pathPrefix = "";
-        }
-        else {
-            this.pathPrefix = prefix;
-        }
-        return this;
-    }
-    /**
-     * Returns the regex matching path for this twirp server
-     */
-    matchingPath() {
-        const baseRegex = this.baseURI().replace(/\./g, "\\.");
-        return new RegExp(`${baseRegex}\/(${this.methodList.join("|")})`);
-    }
-    /**
-     * Returns the base URI for this twirp server
-     */
-    baseURI() {
-        return `${this.pathPrefix}/${this.packageName ? this.packageName + "." : ""}${this.serviceName}`;
-    }
-    /**
-     * Create a twirp context
-     * @param req
-     * @param res
-     * @private
-     */
-    createContext(req, res) {
-        return {
-            packageName: this.packageName,
-            serviceName: this.serviceName,
-            methodName: "",
-            contentType: request_1.getContentType(req.headers["content-type"]),
-            req: req,
-            res: res,
-        };
-    }
-    /**
-     * Twrip server http handler implementation
-     * @param req
-     * @param resp
-     * @private
-     */
-    _httpHandler(req, resp) {
-        return __awaiter(this, void 0, void 0, function* () {
-            const ctx = this.createContext(req, resp);
-            try {
-                yield this.invokeHook("requestReceived", ctx);
-                const { method, mimeContentType } = request_1.validateRequest(ctx, req, this.pathPrefix || "");
-                const handler = this.matchRoute(method, {
-                    onMatch: (ctx) => {
-                        return this.invokeHook("requestRouted", ctx);
-                    },
-                    onNotFound: () => {
-                        const msg = `no handler for path ${req.url}`;
-                        throw new errors_1.BadRouteError(msg, req.method || "", req.url || "");
-                    },
-                });
-                const body = yield request_1.getRequestData(req);
-                const response = yield handler(ctx, this.service, body, this.interceptors);
-                yield Promise.all([
-                    this.invokeHook("responsePrepared", ctx),
-                    // keep backwards compatibility till next release
-                    this.invokeHook("requestPrepared", ctx),
-                ]);
-                resp.statusCode = 200;
-                resp.setHeader("Content-Type", mimeContentType);
-                resp.end(response);
-            }
-            catch (e) {
-                yield this.invokeHook("error", ctx, mustBeTwirpError(e));
-                if (!resp.headersSent) {
-                    writeError(resp, e);
-                }
-            }
-            finally {
-                yield Promise.all([
-                    this.invokeHook("responseSent", ctx),
-                    // keep backwards compatibility till next release
-                    this.invokeHook("requestSent", ctx),
-                ]);
-            }
-        });
-    }
-    /**
-     * Invoke a hook
-     * @param hookName
-     * @param ctx
-     * @param err
-     * @protected
-     */
-    invokeHook(hookName, ctx, err) {
-        return __awaiter(this, void 0, void 0, function* () {
-            if (this.hooks.length === 0) {
-                return;
-            }
-            const chainedHooks = hooks_1.chainHooks(...this.hooks);
-            const hook = chainedHooks === null || chainedHooks === void 0 ? void 0 : chainedHooks[hookName];
-            if (hook) {
-                yield hook(ctx, err || new errors_1.InternalServerError("internal server error"));
-            }
-        });
-    }
-}
-exports.TwirpServer = TwirpServer;
-/**
- * Write http error response
- * @param res
- * @param error
- */
-function writeError(res, error) {
-    const twirpError = mustBeTwirpError(error);
-    res.setHeader("Content-Type", "application/json");
-    res.statusCode = errors_1.httpStatusFromErrorCode(twirpError.code);
-    res.end(twirpError.toJSON());
-}
-exports.writeError = writeError;
-/**
- * Make sure that the error passed is a TwirpError
- * otherwise it will wrap it into an InternalError
- * @param err
- */
-function mustBeTwirpError(err) {
-    if (err instanceof errors_1.TwirpError) {
-        return err;
-    }
-    return new errors_1.InternalServerErrorWith(err);
-}
-
-
 /***/ }),
 
 /***/ 1773:
@@ -93102,7 +90239,7 @@ module.exports = parseParams
 /***/ ((module) => {
 
 "use strict";
-module.exports = JSON.parse('{"name":"@actions/cache","version":"4.0.0","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1","twirp-ts":"^2.5.0"},"devDependencies":{"@types/semver":"^6.0.0","typescript":"^5.2.2"}}');
+module.exports = JSON.parse('{"name":"@actions/cache","version":"4.0.2","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1"},"devDependencies":{"@types/semver":"^6.0.0","typescript":"^5.2.2"}}');
 
 /***/ }),
 
diff --git a/dist/setup/index.js b/dist/setup/index.js
index 6682b6d30..e77c9caea 100644
--- a/dist/setup/index.js
+++ b/dist/setup/index.js
@@ -220,7 +220,7 @@ function restoreCacheV2(paths, primaryKey, restoreKeys, options, enableCrossOsAr
             };
             const response = yield twirpClient.GetCacheEntryDownloadURL(request);
             if (!response.ok) {
-                core.warning(`Cache not found for keys: ${keys.join(', ')}`);
+                core.debug(`Cache not found for keys: ${keys.join(', ')}`);
                 return undefined;
             }
             core.info(`Cache hit for: ${request.key}`);
@@ -412,12 +412,20 @@ function saveCacheV2(paths, key, options, enableCrossOsArchive = false) {
                 key,
                 version
             };
-            const response = yield twirpClient.CreateCacheEntry(request);
-            if (!response.ok) {
+            let signedUploadUrl;
+            try {
+                const response = yield twirpClient.CreateCacheEntry(request);
+                if (!response.ok) {
+                    throw new Error('Response was not ok');
+                }
+                signedUploadUrl = response.signedUploadUrl;
+            }
+            catch (error) {
+                core.debug(`Failed to reserve cache: ${error}`);
                 throw new ReserveCacheError(`Unable to reserve cache with key ${key}, another job may be creating this cache.`);
             }
             core.debug(`Attempting to upload cache located at: ${archivePath}`);
-            yield cacheHttpClient.saveCache(cacheId, archivePath, response.signedUploadUrl, options);
+            yield cacheHttpClient.saveCache(cacheId, archivePath, signedUploadUrl, options);
             const finalizeRequest = {
                 key,
                 version,
@@ -458,156 +466,13 @@ function saveCacheV2(paths, key, options, enableCrossOsArchive = false) {
 
 /***/ }),
 
-/***/ 4469:
-/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.Timestamp = void 0;
-const runtime_1 = __nccwpck_require__(4061);
-const runtime_2 = __nccwpck_require__(4061);
-const runtime_3 = __nccwpck_require__(4061);
-const runtime_4 = __nccwpck_require__(4061);
-const runtime_5 = __nccwpck_require__(4061);
-const runtime_6 = __nccwpck_require__(4061);
-const runtime_7 = __nccwpck_require__(4061);
-// @generated message type with reflection information, may provide speed optimized methods
-class Timestamp$Type extends runtime_7.MessageType {
-    constructor() {
-        super("google.protobuf.Timestamp", [
-            { no: 1, name: "seconds", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
-            { no: 2, name: "nanos", kind: "scalar", T: 5 /*ScalarType.INT32*/ }
-        ]);
-    }
-    /**
-     * Creates a new `Timestamp` for the current time.
-     */
-    now() {
-        const msg = this.create();
-        const ms = Date.now();
-        msg.seconds = runtime_6.PbLong.from(Math.floor(ms / 1000)).toString();
-        msg.nanos = (ms % 1000) * 1000000;
-        return msg;
-    }
-    /**
-     * Converts a `Timestamp` to a JavaScript Date.
-     */
-    toDate(message) {
-        return new Date(runtime_6.PbLong.from(message.seconds).toNumber() * 1000 + Math.ceil(message.nanos / 1000000));
-    }
-    /**
-     * Converts a JavaScript Date to a `Timestamp`.
-     */
-    fromDate(date) {
-        const msg = this.create();
-        const ms = date.getTime();
-        msg.seconds = runtime_6.PbLong.from(Math.floor(ms / 1000)).toString();
-        msg.nanos = (ms % 1000) * 1000000;
-        return msg;
-    }
-    /**
-     * In JSON format, the `Timestamp` type is encoded as a string
-     * in the RFC 3339 format.
-     */
-    internalJsonWrite(message, options) {
-        let ms = runtime_6.PbLong.from(message.seconds).toNumber() * 1000;
-        if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z"))
-            throw new Error("Unable to encode Timestamp to JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");
-        if (message.nanos < 0)
-            throw new Error("Unable to encode invalid Timestamp to JSON. Nanos must not be negative.");
-        let z = "Z";
-        if (message.nanos > 0) {
-            let nanosStr = (message.nanos + 1000000000).toString().substring(1);
-            if (nanosStr.substring(3) === "000000")
-                z = "." + nanosStr.substring(0, 3) + "Z";
-            else if (nanosStr.substring(6) === "000")
-                z = "." + nanosStr.substring(0, 6) + "Z";
-            else
-                z = "." + nanosStr + "Z";
-        }
-        return new Date(ms).toISOString().replace(".000Z", z);
-    }
-    /**
-     * In JSON format, the `Timestamp` type is encoded as a string
-     * in the RFC 3339 format.
-     */
-    internalJsonRead(json, options, target) {
-        if (typeof json !== "string")
-            throw new Error("Unable to parse Timestamp from JSON " + (0, runtime_5.typeofJsonValue)(json) + ".");
-        let matches = json.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/);
-        if (!matches)
-            throw new Error("Unable to parse Timestamp from JSON. Invalid format.");
-        let ms = Date.parse(matches[1] + "-" + matches[2] + "-" + matches[3] + "T" + matches[4] + ":" + matches[5] + ":" + matches[6] + (matches[8] ? matches[8] : "Z"));
-        if (Number.isNaN(ms))
-            throw new Error("Unable to parse Timestamp from JSON. Invalid value.");
-        if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z"))
-            throw new globalThis.Error("Unable to parse Timestamp from JSON. Must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive.");
-        if (!target)
-            target = this.create();
-        target.seconds = runtime_6.PbLong.from(ms / 1000).toString();
-        target.nanos = 0;
-        if (matches[7])
-            target.nanos = (parseInt("1" + matches[7] + "0".repeat(9 - matches[7].length)) - 1000000000);
-        return target;
-    }
-    create(value) {
-        const message = { seconds: "0", nanos: 0 };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* int64 seconds */ 1:
-                    message.seconds = reader.int64().toString();
-                    break;
-                case /* int32 nanos */ 2:
-                    message.nanos = reader.int32();
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* int64 seconds = 1; */
-        if (message.seconds !== "0")
-            writer.tag(1, runtime_1.WireType.Varint).int64(message.seconds);
-        /* int32 nanos = 2; */
-        if (message.nanos !== 0)
-            writer.tag(2, runtime_1.WireType.Varint).int32(message.nanos);
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message google.protobuf.Timestamp
- */
-exports.Timestamp = new Timestamp$Type();
-//# sourceMappingURL=timestamp.js.map
-
-/***/ }),
-
 /***/ 4388:
 /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
 
 "use strict";
 
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.CacheService = exports.LookupCacheEntryResponse = exports.LookupCacheEntryRequest = exports.ListCacheEntriesResponse = exports.ListCacheEntriesRequest = exports.DeleteCacheEntryResponse = exports.DeleteCacheEntryRequest = exports.GetCacheEntryDownloadURLResponse = exports.GetCacheEntryDownloadURLRequest = exports.FinalizeCacheEntryUploadResponse = exports.FinalizeCacheEntryUploadRequest = exports.CreateCacheEntryResponse = exports.CreateCacheEntryRequest = void 0;
+exports.CacheService = exports.GetCacheEntryDownloadURLResponse = exports.GetCacheEntryDownloadURLRequest = exports.FinalizeCacheEntryUploadResponse = exports.FinalizeCacheEntryUploadRequest = exports.CreateCacheEntryResponse = exports.CreateCacheEntryRequest = void 0;
 // @generated by protobuf-ts 2.9.1 with parameter long_type_string,client_none,generate_dependencies
 // @generated from protobuf file "results/api/v1/cache.proto" (package "github.actions.results.api.v1", syntax proto3)
 // tslint:disable
@@ -617,7 +482,6 @@ const runtime_2 = __nccwpck_require__(4061);
 const runtime_3 = __nccwpck_require__(4061);
 const runtime_4 = __nccwpck_require__(4061);
 const runtime_5 = __nccwpck_require__(4061);
-const cacheentry_1 = __nccwpck_require__(3639);
 const cachemetadata_1 = __nccwpck_require__(7988);
 // @generated message type with reflection information, may provide speed optimized methods
 class CreateCacheEntryRequest$Type extends runtime_5.MessageType {
@@ -985,376 +849,25 @@ class GetCacheEntryDownloadURLResponse$Type extends runtime_5.MessageType {
  * @generated MessageType for protobuf message github.actions.results.api.v1.GetCacheEntryDownloadURLResponse
  */
 exports.GetCacheEntryDownloadURLResponse = new GetCacheEntryDownloadURLResponse$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class DeleteCacheEntryRequest$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.DeleteCacheEntryRequest", [
-            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
-            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
-        ]);
-    }
-    create(value) {
-        const message = { key: "" };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
-                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
-                    break;
-                case /* string key */ 2:
-                    message.key = reader.string();
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
-        if (message.metadata)
-            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        /* string key = 2; */
-        if (message.key !== "")
-            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.DeleteCacheEntryRequest
- */
-exports.DeleteCacheEntryRequest = new DeleteCacheEntryRequest$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class DeleteCacheEntryResponse$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.DeleteCacheEntryResponse", [
-            { no: 1, name: "ok", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
-            { no: 2, name: "entry_id", kind: "scalar", T: 3 /*ScalarType.INT64*/ }
-        ]);
-    }
-    create(value) {
-        const message = { ok: false, entryId: "0" };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* bool ok */ 1:
-                    message.ok = reader.bool();
-                    break;
-                case /* int64 entry_id */ 2:
-                    message.entryId = reader.int64().toString();
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* bool ok = 1; */
-        if (message.ok !== false)
-            writer.tag(1, runtime_1.WireType.Varint).bool(message.ok);
-        /* int64 entry_id = 2; */
-        if (message.entryId !== "0")
-            writer.tag(2, runtime_1.WireType.Varint).int64(message.entryId);
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.DeleteCacheEntryResponse
- */
-exports.DeleteCacheEntryResponse = new DeleteCacheEntryResponse$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class ListCacheEntriesRequest$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.ListCacheEntriesRequest", [
-            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
-            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 3, name: "restore_keys", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ }
-        ]);
-    }
-    create(value) {
-        const message = { key: "", restoreKeys: [] };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
-                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
-                    break;
-                case /* string key */ 2:
-                    message.key = reader.string();
-                    break;
-                case /* repeated string restore_keys */ 3:
-                    message.restoreKeys.push(reader.string());
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
-        if (message.metadata)
-            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        /* string key = 2; */
-        if (message.key !== "")
-            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
-        /* repeated string restore_keys = 3; */
-        for (let i = 0; i < message.restoreKeys.length; i++)
-            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.restoreKeys[i]);
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.ListCacheEntriesRequest
- */
-exports.ListCacheEntriesRequest = new ListCacheEntriesRequest$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class ListCacheEntriesResponse$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.ListCacheEntriesResponse", [
-            { no: 1, name: "entries", kind: "message", repeat: 1 /*RepeatType.PACKED*/, T: () => cacheentry_1.CacheEntry }
-        ]);
-    }
-    create(value) {
-        const message = { entries: [] };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* repeated github.actions.results.entities.v1.CacheEntry entries */ 1:
-                    message.entries.push(cacheentry_1.CacheEntry.internalBinaryRead(reader, reader.uint32(), options));
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* repeated github.actions.results.entities.v1.CacheEntry entries = 1; */
-        for (let i = 0; i < message.entries.length; i++)
-            cacheentry_1.CacheEntry.internalBinaryWrite(message.entries[i], writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.ListCacheEntriesResponse
- */
-exports.ListCacheEntriesResponse = new ListCacheEntriesResponse$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class LookupCacheEntryRequest$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.LookupCacheEntryRequest", [
-            { no: 1, name: "metadata", kind: "message", T: () => cachemetadata_1.CacheMetadata },
-            { no: 2, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 3, name: "restore_keys", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ },
-            { no: 4, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ }
-        ]);
-    }
-    create(value) {
-        const message = { key: "", restoreKeys: [], version: "" };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* github.actions.results.entities.v1.CacheMetadata metadata */ 1:
-                    message.metadata = cachemetadata_1.CacheMetadata.internalBinaryRead(reader, reader.uint32(), options, message.metadata);
-                    break;
-                case /* string key */ 2:
-                    message.key = reader.string();
-                    break;
-                case /* repeated string restore_keys */ 3:
-                    message.restoreKeys.push(reader.string());
-                    break;
-                case /* string version */ 4:
-                    message.version = reader.string();
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* github.actions.results.entities.v1.CacheMetadata metadata = 1; */
-        if (message.metadata)
-            cachemetadata_1.CacheMetadata.internalBinaryWrite(message.metadata, writer.tag(1, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        /* string key = 2; */
-        if (message.key !== "")
-            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.key);
-        /* repeated string restore_keys = 3; */
-        for (let i = 0; i < message.restoreKeys.length; i++)
-            writer.tag(3, runtime_1.WireType.LengthDelimited).string(message.restoreKeys[i]);
-        /* string version = 4; */
-        if (message.version !== "")
-            writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.version);
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.LookupCacheEntryRequest
- */
-exports.LookupCacheEntryRequest = new LookupCacheEntryRequest$Type();
-// @generated message type with reflection information, may provide speed optimized methods
-class LookupCacheEntryResponse$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.api.v1.LookupCacheEntryResponse", [
-            { no: 1, name: "exists", kind: "scalar", T: 8 /*ScalarType.BOOL*/ },
-            { no: 2, name: "entry", kind: "message", T: () => cacheentry_1.CacheEntry }
-        ]);
-    }
-    create(value) {
-        const message = { exists: false };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* bool exists */ 1:
-                    message.exists = reader.bool();
-                    break;
-                case /* github.actions.results.entities.v1.CacheEntry entry */ 2:
-                    message.entry = cacheentry_1.CacheEntry.internalBinaryRead(reader, reader.uint32(), options, message.entry);
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* bool exists = 1; */
-        if (message.exists !== false)
-            writer.tag(1, runtime_1.WireType.Varint).bool(message.exists);
-        /* github.actions.results.entities.v1.CacheEntry entry = 2; */
-        if (message.entry)
-            cacheentry_1.CacheEntry.internalBinaryWrite(message.entry, writer.tag(2, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.api.v1.LookupCacheEntryResponse
- */
-exports.LookupCacheEntryResponse = new LookupCacheEntryResponse$Type();
 /**
  * @generated ServiceType for protobuf service github.actions.results.api.v1.CacheService
  */
 exports.CacheService = new runtime_rpc_1.ServiceType("github.actions.results.api.v1.CacheService", [
     { name: "CreateCacheEntry", options: {}, I: exports.CreateCacheEntryRequest, O: exports.CreateCacheEntryResponse },
     { name: "FinalizeCacheEntryUpload", options: {}, I: exports.FinalizeCacheEntryUploadRequest, O: exports.FinalizeCacheEntryUploadResponse },
-    { name: "GetCacheEntryDownloadURL", options: {}, I: exports.GetCacheEntryDownloadURLRequest, O: exports.GetCacheEntryDownloadURLResponse },
-    { name: "DeleteCacheEntry", options: {}, I: exports.DeleteCacheEntryRequest, O: exports.DeleteCacheEntryResponse },
-    { name: "ListCacheEntries", options: {}, I: exports.ListCacheEntriesRequest, O: exports.ListCacheEntriesResponse },
-    { name: "LookupCacheEntry", options: {}, I: exports.LookupCacheEntryRequest, O: exports.LookupCacheEntryResponse }
+    { name: "GetCacheEntryDownloadURL", options: {}, I: exports.GetCacheEntryDownloadURLRequest, O: exports.GetCacheEntryDownloadURLResponse }
 ]);
 //# sourceMappingURL=cache.js.map
 
 /***/ }),
 
-/***/ 267:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+/***/ 2655:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
 
 "use strict";
 
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
 Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.createCacheServiceServer = exports.CacheServiceMethodList = exports.CacheServiceMethod = exports.CacheServiceClientProtobuf = exports.CacheServiceClientJSON = void 0;
-const twirp_ts_1 = __nccwpck_require__(6465);
+exports.CacheServiceClientProtobuf = exports.CacheServiceClientJSON = void 0;
 const cache_1 = __nccwpck_require__(4388);
 class CacheServiceClientJSON {
     constructor(rpc) {
@@ -1362,9 +875,6 @@ class CacheServiceClientJSON {
         this.CreateCacheEntry.bind(this);
         this.FinalizeCacheEntryUpload.bind(this);
         this.GetCacheEntryDownloadURL.bind(this);
-        this.DeleteCacheEntry.bind(this);
-        this.ListCacheEntries.bind(this);
-        this.LookupCacheEntry.bind(this);
     }
     CreateCacheEntry(request) {
         const data = cache_1.CreateCacheEntryRequest.toJson(request, {
@@ -1396,36 +906,6 @@ class CacheServiceClientJSON {
             ignoreUnknownFields: true,
         }));
     }
-    DeleteCacheEntry(request) {
-        const data = cache_1.DeleteCacheEntryRequest.toJson(request, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        });
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "DeleteCacheEntry", "application/json", data);
-        return promise.then((data) => cache_1.DeleteCacheEntryResponse.fromJson(data, {
-            ignoreUnknownFields: true,
-        }));
-    }
-    ListCacheEntries(request) {
-        const data = cache_1.ListCacheEntriesRequest.toJson(request, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        });
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "ListCacheEntries", "application/json", data);
-        return promise.then((data) => cache_1.ListCacheEntriesResponse.fromJson(data, {
-            ignoreUnknownFields: true,
-        }));
-    }
-    LookupCacheEntry(request) {
-        const data = cache_1.LookupCacheEntryRequest.toJson(request, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        });
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "LookupCacheEntry", "application/json", data);
-        return promise.then((data) => cache_1.LookupCacheEntryResponse.fromJson(data, {
-            ignoreUnknownFields: true,
-        }));
-    }
 }
 exports.CacheServiceClientJSON = CacheServiceClientJSON;
 class CacheServiceClientProtobuf {
@@ -1434,9 +914,6 @@ class CacheServiceClientProtobuf {
         this.CreateCacheEntry.bind(this);
         this.FinalizeCacheEntryUpload.bind(this);
         this.GetCacheEntryDownloadURL.bind(this);
-        this.DeleteCacheEntry.bind(this);
-        this.ListCacheEntries.bind(this);
-        this.LookupCacheEntry.bind(this);
     }
     CreateCacheEntry(request) {
         const data = cache_1.CreateCacheEntryRequest.toBinary(request);
@@ -1453,610 +930,9 @@ class CacheServiceClientProtobuf {
         const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "GetCacheEntryDownloadURL", "application/protobuf", data);
         return promise.then((data) => cache_1.GetCacheEntryDownloadURLResponse.fromBinary(data));
     }
-    DeleteCacheEntry(request) {
-        const data = cache_1.DeleteCacheEntryRequest.toBinary(request);
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "DeleteCacheEntry", "application/protobuf", data);
-        return promise.then((data) => cache_1.DeleteCacheEntryResponse.fromBinary(data));
-    }
-    ListCacheEntries(request) {
-        const data = cache_1.ListCacheEntriesRequest.toBinary(request);
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "ListCacheEntries", "application/protobuf", data);
-        return promise.then((data) => cache_1.ListCacheEntriesResponse.fromBinary(data));
-    }
-    LookupCacheEntry(request) {
-        const data = cache_1.LookupCacheEntryRequest.toBinary(request);
-        const promise = this.rpc.request("github.actions.results.api.v1.CacheService", "LookupCacheEntry", "application/protobuf", data);
-        return promise.then((data) => cache_1.LookupCacheEntryResponse.fromBinary(data));
-    }
 }
 exports.CacheServiceClientProtobuf = CacheServiceClientProtobuf;
-var CacheServiceMethod;
-(function (CacheServiceMethod) {
-    CacheServiceMethod["CreateCacheEntry"] = "CreateCacheEntry";
-    CacheServiceMethod["FinalizeCacheEntryUpload"] = "FinalizeCacheEntryUpload";
-    CacheServiceMethod["GetCacheEntryDownloadURL"] = "GetCacheEntryDownloadURL";
-    CacheServiceMethod["DeleteCacheEntry"] = "DeleteCacheEntry";
-    CacheServiceMethod["ListCacheEntries"] = "ListCacheEntries";
-    CacheServiceMethod["LookupCacheEntry"] = "LookupCacheEntry";
-})(CacheServiceMethod || (exports.CacheServiceMethod = CacheServiceMethod = {}));
-exports.CacheServiceMethodList = [
-    CacheServiceMethod.CreateCacheEntry,
-    CacheServiceMethod.FinalizeCacheEntryUpload,
-    CacheServiceMethod.GetCacheEntryDownloadURL,
-    CacheServiceMethod.DeleteCacheEntry,
-    CacheServiceMethod.ListCacheEntries,
-    CacheServiceMethod.LookupCacheEntry,
-];
-function createCacheServiceServer(service) {
-    return new twirp_ts_1.TwirpServer({
-        service,
-        packageName: "github.actions.results.api.v1",
-        serviceName: "CacheService",
-        methodList: exports.CacheServiceMethodList,
-        matchRoute: matchCacheServiceRoute,
-    });
-}
-exports.createCacheServiceServer = createCacheServiceServer;
-function matchCacheServiceRoute(method, events) {
-    switch (method) {
-        case "CreateCacheEntry":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "CreateCacheEntry" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceCreateCacheEntryRequest(ctx, service, data, interceptors);
-            });
-        case "FinalizeCacheEntryUpload":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "FinalizeCacheEntryUpload" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceFinalizeCacheEntryUploadRequest(ctx, service, data, interceptors);
-            });
-        case "GetCacheEntryDownloadURL":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "GetCacheEntryDownloadURL" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceGetCacheEntryDownloadURLRequest(ctx, service, data, interceptors);
-            });
-        case "DeleteCacheEntry":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "DeleteCacheEntry" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceDeleteCacheEntryRequest(ctx, service, data, interceptors);
-            });
-        case "ListCacheEntries":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "ListCacheEntries" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceListCacheEntriesRequest(ctx, service, data, interceptors);
-            });
-        case "LookupCacheEntry":
-            return (ctx, service, data, interceptors) => __awaiter(this, void 0, void 0, function* () {
-                ctx = Object.assign(Object.assign({}, ctx), { methodName: "LookupCacheEntry" });
-                yield events.onMatch(ctx);
-                return handleCacheServiceLookupCacheEntryRequest(ctx, service, data, interceptors);
-            });
-        default:
-            events.onNotFound();
-            const msg = `no handler found`;
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceCreateCacheEntryRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceCreateCacheEntryJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceCreateCacheEntryProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceFinalizeCacheEntryUploadRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceFinalizeCacheEntryUploadJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceFinalizeCacheEntryUploadProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceGetCacheEntryDownloadURLRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceGetCacheEntryDownloadURLJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceGetCacheEntryDownloadURLProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceDeleteCacheEntryRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceDeleteCacheEntryJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceDeleteCacheEntryProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceListCacheEntriesRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceListCacheEntriesJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceListCacheEntriesProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceLookupCacheEntryRequest(ctx, service, data, interceptors) {
-    switch (ctx.contentType) {
-        case twirp_ts_1.TwirpContentType.JSON:
-            return handleCacheServiceLookupCacheEntryJSON(ctx, service, data, interceptors);
-        case twirp_ts_1.TwirpContentType.Protobuf:
-            return handleCacheServiceLookupCacheEntryProtobuf(ctx, service, data, interceptors);
-        default:
-            const msg = "unexpected Content-Type";
-            throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.BadRoute, msg);
-    }
-}
-function handleCacheServiceCreateCacheEntryJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.CreateCacheEntryRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.CreateCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.CreateCacheEntry(ctx, request);
-        }
-        return JSON.stringify(cache_1.CreateCacheEntryResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceFinalizeCacheEntryUploadJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.FinalizeCacheEntryUploadRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.FinalizeCacheEntryUpload(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.FinalizeCacheEntryUpload(ctx, request);
-        }
-        return JSON.stringify(cache_1.FinalizeCacheEntryUploadResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceGetCacheEntryDownloadURLJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.GetCacheEntryDownloadURLRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.GetCacheEntryDownloadURL(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.GetCacheEntryDownloadURL(ctx, request);
-        }
-        return JSON.stringify(cache_1.GetCacheEntryDownloadURLResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceDeleteCacheEntryJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.DeleteCacheEntryRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.DeleteCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.DeleteCacheEntry(ctx, request);
-        }
-        return JSON.stringify(cache_1.DeleteCacheEntryResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceListCacheEntriesJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.ListCacheEntriesRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.ListCacheEntries(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.ListCacheEntries(ctx, request);
-        }
-        return JSON.stringify(cache_1.ListCacheEntriesResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceLookupCacheEntryJSON(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            const body = JSON.parse(data.toString() || "{}");
-            request = cache_1.LookupCacheEntryRequest.fromJson(body, {
-                ignoreUnknownFields: true,
-            });
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the json request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.LookupCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.LookupCacheEntry(ctx, request);
-        }
-        return JSON.stringify(cache_1.LookupCacheEntryResponse.toJson(response, {
-            useProtoFieldName: true,
-            emitDefaultValues: false,
-        }));
-    });
-}
-function handleCacheServiceCreateCacheEntryProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.CreateCacheEntryRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.CreateCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.CreateCacheEntry(ctx, request);
-        }
-        return Buffer.from(cache_1.CreateCacheEntryResponse.toBinary(response));
-    });
-}
-function handleCacheServiceFinalizeCacheEntryUploadProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.FinalizeCacheEntryUploadRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.FinalizeCacheEntryUpload(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.FinalizeCacheEntryUpload(ctx, request);
-        }
-        return Buffer.from(cache_1.FinalizeCacheEntryUploadResponse.toBinary(response));
-    });
-}
-function handleCacheServiceGetCacheEntryDownloadURLProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.GetCacheEntryDownloadURLRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.GetCacheEntryDownloadURL(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.GetCacheEntryDownloadURL(ctx, request);
-        }
-        return Buffer.from(cache_1.GetCacheEntryDownloadURLResponse.toBinary(response));
-    });
-}
-function handleCacheServiceDeleteCacheEntryProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.DeleteCacheEntryRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.DeleteCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.DeleteCacheEntry(ctx, request);
-        }
-        return Buffer.from(cache_1.DeleteCacheEntryResponse.toBinary(response));
-    });
-}
-function handleCacheServiceListCacheEntriesProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.ListCacheEntriesRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.ListCacheEntries(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.ListCacheEntries(ctx, request);
-        }
-        return Buffer.from(cache_1.ListCacheEntriesResponse.toBinary(response));
-    });
-}
-function handleCacheServiceLookupCacheEntryProtobuf(ctx, service, data, interceptors) {
-    return __awaiter(this, void 0, void 0, function* () {
-        let request;
-        let response;
-        try {
-            request = cache_1.LookupCacheEntryRequest.fromBinary(data);
-        }
-        catch (e) {
-            if (e instanceof Error) {
-                const msg = "the protobuf request could not be decoded";
-                throw new twirp_ts_1.TwirpError(twirp_ts_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-            }
-        }
-        if (interceptors && interceptors.length > 0) {
-            const interceptor = (0, twirp_ts_1.chainInterceptors)(...interceptors);
-            response = yield interceptor(ctx, request, (ctx, inputReq) => {
-                return service.LookupCacheEntry(ctx, inputReq);
-            });
-        }
-        else {
-            response = yield service.LookupCacheEntry(ctx, request);
-        }
-        return Buffer.from(cache_1.LookupCacheEntryResponse.toBinary(response));
-    });
-}
-//# sourceMappingURL=cache.twirp.js.map
-
-/***/ }),
-
-/***/ 3639:
-/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.CacheEntry = void 0;
-const runtime_1 = __nccwpck_require__(4061);
-const runtime_2 = __nccwpck_require__(4061);
-const runtime_3 = __nccwpck_require__(4061);
-const runtime_4 = __nccwpck_require__(4061);
-const runtime_5 = __nccwpck_require__(4061);
-const timestamp_1 = __nccwpck_require__(4469);
-// @generated message type with reflection information, may provide speed optimized methods
-class CacheEntry$Type extends runtime_5.MessageType {
-    constructor() {
-        super("github.actions.results.entities.v1.CacheEntry", [
-            { no: 1, name: "key", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 2, name: "hash", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 3, name: "size_bytes", kind: "scalar", T: 3 /*ScalarType.INT64*/ },
-            { no: 4, name: "scope", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 5, name: "version", kind: "scalar", T: 9 /*ScalarType.STRING*/ },
-            { no: 6, name: "created_at", kind: "message", T: () => timestamp_1.Timestamp },
-            { no: 7, name: "last_accessed_at", kind: "message", T: () => timestamp_1.Timestamp },
-            { no: 8, name: "expires_at", kind: "message", T: () => timestamp_1.Timestamp }
-        ]);
-    }
-    create(value) {
-        const message = { key: "", hash: "", sizeBytes: "0", scope: "", version: "" };
-        globalThis.Object.defineProperty(message, runtime_4.MESSAGE_TYPE, { enumerable: false, value: this });
-        if (value !== undefined)
-            (0, runtime_3.reflectionMergePartial)(this, message, value);
-        return message;
-    }
-    internalBinaryRead(reader, length, options, target) {
-        let message = target !== null && target !== void 0 ? target : this.create(), end = reader.pos + length;
-        while (reader.pos < end) {
-            let [fieldNo, wireType] = reader.tag();
-            switch (fieldNo) {
-                case /* string key */ 1:
-                    message.key = reader.string();
-                    break;
-                case /* string hash */ 2:
-                    message.hash = reader.string();
-                    break;
-                case /* int64 size_bytes */ 3:
-                    message.sizeBytes = reader.int64().toString();
-                    break;
-                case /* string scope */ 4:
-                    message.scope = reader.string();
-                    break;
-                case /* string version */ 5:
-                    message.version = reader.string();
-                    break;
-                case /* google.protobuf.Timestamp created_at */ 6:
-                    message.createdAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.createdAt);
-                    break;
-                case /* google.protobuf.Timestamp last_accessed_at */ 7:
-                    message.lastAccessedAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.lastAccessedAt);
-                    break;
-                case /* google.protobuf.Timestamp expires_at */ 8:
-                    message.expiresAt = timestamp_1.Timestamp.internalBinaryRead(reader, reader.uint32(), options, message.expiresAt);
-                    break;
-                default:
-                    let u = options.readUnknownField;
-                    if (u === "throw")
-                        throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`);
-                    let d = reader.skip(wireType);
-                    if (u !== false)
-                        (u === true ? runtime_2.UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d);
-            }
-        }
-        return message;
-    }
-    internalBinaryWrite(message, writer, options) {
-        /* string key = 1; */
-        if (message.key !== "")
-            writer.tag(1, runtime_1.WireType.LengthDelimited).string(message.key);
-        /* string hash = 2; */
-        if (message.hash !== "")
-            writer.tag(2, runtime_1.WireType.LengthDelimited).string(message.hash);
-        /* int64 size_bytes = 3; */
-        if (message.sizeBytes !== "0")
-            writer.tag(3, runtime_1.WireType.Varint).int64(message.sizeBytes);
-        /* string scope = 4; */
-        if (message.scope !== "")
-            writer.tag(4, runtime_1.WireType.LengthDelimited).string(message.scope);
-        /* string version = 5; */
-        if (message.version !== "")
-            writer.tag(5, runtime_1.WireType.LengthDelimited).string(message.version);
-        /* google.protobuf.Timestamp created_at = 6; */
-        if (message.createdAt)
-            timestamp_1.Timestamp.internalBinaryWrite(message.createdAt, writer.tag(6, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        /* google.protobuf.Timestamp last_accessed_at = 7; */
-        if (message.lastAccessedAt)
-            timestamp_1.Timestamp.internalBinaryWrite(message.lastAccessedAt, writer.tag(7, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        /* google.protobuf.Timestamp expires_at = 8; */
-        if (message.expiresAt)
-            timestamp_1.Timestamp.internalBinaryWrite(message.expiresAt, writer.tag(8, runtime_1.WireType.LengthDelimited).fork(), options).join();
-        let u = options.writeUnknownFields;
-        if (u !== false)
-            (u == true ? runtime_2.UnknownFieldHandler.onWrite : u)(this.typeName, message, writer);
-        return writer;
-    }
-}
-/**
- * @generated MessageType for protobuf message github.actions.results.entities.v1.CacheEntry
- */
-exports.CacheEntry = new CacheEntry$Type();
-//# sourceMappingURL=cacheentry.js.map
+//# sourceMappingURL=cache.twirp-client.js.map
 
 /***/ }),
 
@@ -3327,7 +2203,7 @@ const config_1 = __nccwpck_require__(5147);
 const cacheUtils_1 = __nccwpck_require__(1518);
 const auth_1 = __nccwpck_require__(5526);
 const http_client_1 = __nccwpck_require__(6255);
-const cache_twirp_1 = __nccwpck_require__(267);
+const cache_twirp_client_1 = __nccwpck_require__(2655);
 /**
  * This class is a wrapper around the CacheServiceClientJSON class generated by Twirp.
  *
@@ -3464,7 +2340,7 @@ class CacheServiceClient {
 }
 function internalCacheTwirpClient(options) {
     const client = new CacheServiceClient((0, user_agent_1.getUserAgentString)(), options === null || options === void 0 ? void 0 : options.maxAttempts, options === null || options === void 0 ? void 0 : options.retryIntervalMs, options === null || options === void 0 ? void 0 : options.retryMultiplier);
-    return new cache_twirp_1.CacheServiceClientJSON(client);
+    return new cache_twirp_client_1.CacheServiceClientJSON(client);
 }
 exports.internalCacheTwirpClient = internalCacheTwirpClient;
 //# sourceMappingURL=cacheTwirpClient.js.map
@@ -59755,599 +58631,6 @@ class Deprecation extends Error {
 exports.Deprecation = Deprecation;
 
 
-/***/ }),
-
-/***/ 4365:
-/***/ ((module) => {
-
-"use strict";
-
-
-function _process (v, mod) {
-  var i
-  var r
-
-  if (typeof mod === 'function') {
-    r = mod(v)
-    if (r !== undefined) {
-      v = r
-    }
-  } else if (Array.isArray(mod)) {
-    for (i = 0; i < mod.length; i++) {
-      r = mod[i](v)
-      if (r !== undefined) {
-        v = r
-      }
-    }
-  }
-
-  return v
-}
-
-function parseKey (key, val) {
-  // detect negative index notation
-  if (key[0] === '-' && Array.isArray(val) && /^-\d+$/.test(key)) {
-    return val.length + parseInt(key, 10)
-  }
-  return key
-}
-
-function isIndex (k) {
-  return /^\d+$/.test(k)
-}
-
-function isObject (val) {
-  return Object.prototype.toString.call(val) === '[object Object]'
-}
-
-function isArrayOrObject (val) {
-  return Object(val) === val
-}
-
-function isEmptyObject (val) {
-  return Object.keys(val).length === 0
-}
-
-var blacklist = ['__proto__', 'prototype', 'constructor']
-var blacklistFilter = function (part) { return blacklist.indexOf(part) === -1 }
-
-function parsePath (path, sep) {
-  if (path.indexOf('[') >= 0) {
-    path = path.replace(/\[/g, sep).replace(/]/g, '')
-  }
-
-  var parts = path.split(sep)
-
-  var check = parts.filter(blacklistFilter)
-
-  if (check.length !== parts.length) {
-    throw Error('Refusing to update blacklisted property ' + path)
-  }
-
-  return parts
-}
-
-var hasOwnProperty = Object.prototype.hasOwnProperty
-
-function DotObject (separator, override, useArray, useBrackets) {
-  if (!(this instanceof DotObject)) {
-    return new DotObject(separator, override, useArray, useBrackets)
-  }
-
-  if (typeof override === 'undefined') override = false
-  if (typeof useArray === 'undefined') useArray = true
-  if (typeof useBrackets === 'undefined') useBrackets = true
-  this.separator = separator || '.'
-  this.override = override
-  this.useArray = useArray
-  this.useBrackets = useBrackets
-  this.keepArray = false
-
-  // contains touched arrays
-  this.cleanup = []
-}
-
-var dotDefault = new DotObject('.', false, true, true)
-function wrap (method) {
-  return function () {
-    return dotDefault[method].apply(dotDefault, arguments)
-  }
-}
-
-DotObject.prototype._fill = function (a, obj, v, mod) {
-  var k = a.shift()
-
-  if (a.length > 0) {
-    obj[k] = obj[k] || (this.useArray && isIndex(a[0]) ? [] : {})
-
-    if (!isArrayOrObject(obj[k])) {
-      if (this.override) {
-        obj[k] = {}
-      } else {
-        if (!(isArrayOrObject(v) && isEmptyObject(v))) {
-          throw new Error(
-            'Trying to redefine `' + k + '` which is a ' + typeof obj[k]
-          )
-        }
-
-        return
-      }
-    }
-
-    this._fill(a, obj[k], v, mod)
-  } else {
-    if (!this.override && isArrayOrObject(obj[k]) && !isEmptyObject(obj[k])) {
-      if (!(isArrayOrObject(v) && isEmptyObject(v))) {
-        throw new Error("Trying to redefine non-empty obj['" + k + "']")
-      }
-
-      return
-    }
-
-    obj[k] = _process(v, mod)
-  }
-}
-
-/**
- *
- * Converts an object with dotted-key/value pairs to it's expanded version
- *
- * Optionally transformed by a set of modifiers.
- *
- * Usage:
- *
- *   var row = {
- *     'nr': 200,
- *     'doc.name': '  My Document  '
- *   }
- *
- *   var mods = {
- *     'doc.name': [_s.trim, _s.underscored]
- *   }
- *
- *   dot.object(row, mods)
- *
- * @param {Object} obj
- * @param {Object} mods
- */
-DotObject.prototype.object = function (obj, mods) {
-  var self = this
-
-  Object.keys(obj).forEach(function (k) {
-    var mod = mods === undefined ? null : mods[k]
-    // normalize array notation.
-    var ok = parsePath(k, self.separator).join(self.separator)
-
-    if (ok.indexOf(self.separator) !== -1) {
-      self._fill(ok.split(self.separator), obj, obj[k], mod)
-      delete obj[k]
-    } else {
-      obj[k] = _process(obj[k], mod)
-    }
-  })
-
-  return obj
-}
-
-/**
- * @param {String} path dotted path
- * @param {String} v value to be set
- * @param {Object} obj object to be modified
- * @param {Function|Array} mod optional modifier
- */
-DotObject.prototype.str = function (path, v, obj, mod) {
-  var ok = parsePath(path, this.separator).join(this.separator)
-
-  if (path.indexOf(this.separator) !== -1) {
-    this._fill(ok.split(this.separator), obj, v, mod)
-  } else {
-    obj[path] = _process(v, mod)
-  }
-
-  return obj
-}
-
-/**
- *
- * Pick a value from an object using dot notation.
- *
- * Optionally remove the value
- *
- * @param {String} path
- * @param {Object} obj
- * @param {Boolean} remove
- */
-DotObject.prototype.pick = function (path, obj, remove, reindexArray) {
-  var i
-  var keys
-  var val
-  var key
-  var cp
-
-  keys = parsePath(path, this.separator)
-  for (i = 0; i < keys.length; i++) {
-    key = parseKey(keys[i], obj)
-    if (obj && typeof obj === 'object' && key in obj) {
-      if (i === keys.length - 1) {
-        if (remove) {
-          val = obj[key]
-          if (reindexArray && Array.isArray(obj)) {
-            obj.splice(key, 1)
-          } else {
-            delete obj[key]
-          }
-          if (Array.isArray(obj)) {
-            cp = keys.slice(0, -1).join('.')
-            if (this.cleanup.indexOf(cp) === -1) {
-              this.cleanup.push(cp)
-            }
-          }
-          return val
-        } else {
-          return obj[key]
-        }
-      } else {
-        obj = obj[key]
-      }
-    } else {
-      return undefined
-    }
-  }
-  if (remove && Array.isArray(obj)) {
-    obj = obj.filter(function (n) {
-      return n !== undefined
-    })
-  }
-  return obj
-}
-/**
- *
- * Delete value from an object using dot notation.
- *
- * @param {String} path
- * @param {Object} obj
- * @return {any} The removed value
- */
-DotObject.prototype.delete = function (path, obj) {
-  return this.remove(path, obj, true)
-}
-
-/**
- *
- * Remove value from an object using dot notation.
- *
- * Will remove multiple items if path is an array.
- * In this case array indexes will be retained until all
- * removals have been processed.
- *
- * Use dot.delete() to automatically  re-index arrays.
- *
- * @param {String|Array<String>} path
- * @param {Object} obj
- * @param {Boolean} reindexArray
- * @return {any} The removed value
- */
-DotObject.prototype.remove = function (path, obj, reindexArray) {
-  var i
-
-  this.cleanup = []
-  if (Array.isArray(path)) {
-    for (i = 0; i < path.length; i++) {
-      this.pick(path[i], obj, true, reindexArray)
-    }
-    if (!reindexArray) {
-      this._cleanup(obj)
-    }
-    return obj
-  } else {
-    return this.pick(path, obj, true, reindexArray)
-  }
-}
-
-DotObject.prototype._cleanup = function (obj) {
-  var ret
-  var i
-  var keys
-  var root
-  if (this.cleanup.length) {
-    for (i = 0; i < this.cleanup.length; i++) {
-      keys = this.cleanup[i].split('.')
-      root = keys.splice(0, -1).join('.')
-      ret = root ? this.pick(root, obj) : obj
-      ret = ret[keys[0]].filter(function (v) {
-        return v !== undefined
-      })
-      this.set(this.cleanup[i], ret, obj)
-    }
-    this.cleanup = []
-  }
-}
-
-/**
- * Alias method  for `dot.remove`
- *
- * Note: this is not an alias for dot.delete()
- *
- * @param {String|Array<String>} path
- * @param {Object} obj
- * @param {Boolean} reindexArray
- * @return {any} The removed value
- */
-DotObject.prototype.del = DotObject.prototype.remove
-
-/**
- *
- * Move a property from one place to the other.
- *
- * If the source path does not exist (undefined)
- * the target property will not be set.
- *
- * @param {String} source
- * @param {String} target
- * @param {Object} obj
- * @param {Function|Array} mods
- * @param {Boolean} merge
- */
-DotObject.prototype.move = function (source, target, obj, mods, merge) {
-  if (typeof mods === 'function' || Array.isArray(mods)) {
-    this.set(target, _process(this.pick(source, obj, true), mods), obj, merge)
-  } else {
-    merge = mods
-    this.set(target, this.pick(source, obj, true), obj, merge)
-  }
-
-  return obj
-}
-
-/**
- *
- * Transfer a property from one object to another object.
- *
- * If the source path does not exist (undefined)
- * the property on the other object will not be set.
- *
- * @param {String} source
- * @param {String} target
- * @param {Object} obj1
- * @param {Object} obj2
- * @param {Function|Array} mods
- * @param {Boolean} merge
- */
-DotObject.prototype.transfer = function (
-  source,
-  target,
-  obj1,
-  obj2,
-  mods,
-  merge
-) {
-  if (typeof mods === 'function' || Array.isArray(mods)) {
-    this.set(
-      target,
-      _process(this.pick(source, obj1, true), mods),
-      obj2,
-      merge
-    )
-  } else {
-    merge = mods
-    this.set(target, this.pick(source, obj1, true), obj2, merge)
-  }
-
-  return obj2
-}
-
-/**
- *
- * Copy a property from one object to another object.
- *
- * If the source path does not exist (undefined)
- * the property on the other object will not be set.
- *
- * @param {String} source
- * @param {String} target
- * @param {Object} obj1
- * @param {Object} obj2
- * @param {Function|Array} mods
- * @param {Boolean} merge
- */
-DotObject.prototype.copy = function (source, target, obj1, obj2, mods, merge) {
-  if (typeof mods === 'function' || Array.isArray(mods)) {
-    this.set(
-      target,
-      _process(
-        // clone what is picked
-        JSON.parse(JSON.stringify(this.pick(source, obj1, false))),
-        mods
-      ),
-      obj2,
-      merge
-    )
-  } else {
-    merge = mods
-    this.set(target, this.pick(source, obj1, false), obj2, merge)
-  }
-
-  return obj2
-}
-
-/**
- *
- * Set a property on an object using dot notation.
- *
- * @param {String} path
- * @param {any} val
- * @param {Object} obj
- * @param {Boolean} merge
- */
-DotObject.prototype.set = function (path, val, obj, merge) {
-  var i
-  var k
-  var keys
-  var key
-
-  // Do not operate if the value is undefined.
-  if (typeof val === 'undefined') {
-    return obj
-  }
-  keys = parsePath(path, this.separator)
-
-  for (i = 0; i < keys.length; i++) {
-    key = keys[i]
-    if (i === keys.length - 1) {
-      if (merge && isObject(val) && isObject(obj[key])) {
-        for (k in val) {
-          if (hasOwnProperty.call(val, k)) {
-            obj[key][k] = val[k]
-          }
-        }
-      } else if (merge && Array.isArray(obj[key]) && Array.isArray(val)) {
-        for (var j = 0; j < val.length; j++) {
-          obj[keys[i]].push(val[j])
-        }
-      } else {
-        obj[key] = val
-      }
-    } else if (
-      // force the value to be an object
-      !hasOwnProperty.call(obj, key) ||
-      (!isObject(obj[key]) && !Array.isArray(obj[key]))
-    ) {
-      // initialize as array if next key is numeric
-      if (/^\d+$/.test(keys[i + 1])) {
-        obj[key] = []
-      } else {
-        obj[key] = {}
-      }
-    }
-    obj = obj[key]
-  }
-  return obj
-}
-
-/**
- *
- * Transform an object
- *
- * Usage:
- *
- *   var obj = {
- *     "id": 1,
- *    "some": {
- *      "thing": "else"
- *    }
- *   }
- *
- *   var transform = {
- *     "id": "nr",
- *    "some.thing": "name"
- *   }
- *
- *   var tgt = dot.transform(transform, obj)
- *
- * @param {Object} recipe Transform recipe
- * @param {Object} obj Object to be transformed
- * @param {Array} mods modifiers for the target
- */
-DotObject.prototype.transform = function (recipe, obj, tgt) {
-  obj = obj || {}
-  tgt = tgt || {}
-  Object.keys(recipe).forEach(
-    function (key) {
-      this.set(recipe[key], this.pick(key, obj), tgt)
-    }.bind(this)
-  )
-  return tgt
-}
-
-/**
- *
- * Convert object to dotted-key/value pair
- *
- * Usage:
- *
- *   var tgt = dot.dot(obj)
- *
- *   or
- *
- *   var tgt = {}
- *   dot.dot(obj, tgt)
- *
- * @param {Object} obj source object
- * @param {Object} tgt target object
- * @param {Array} path path array (internal)
- */
-DotObject.prototype.dot = function (obj, tgt, path) {
-  tgt = tgt || {}
-  path = path || []
-  var isArray = Array.isArray(obj)
-
-  Object.keys(obj).forEach(
-    function (key) {
-      var index = isArray && this.useBrackets ? '[' + key + ']' : key
-      if (
-        isArrayOrObject(obj[key]) &&
-        ((isObject(obj[key]) && !isEmptyObject(obj[key])) ||
-          (Array.isArray(obj[key]) && !this.keepArray && obj[key].length !== 0))
-      ) {
-        if (isArray && this.useBrackets) {
-          var previousKey = path[path.length - 1] || ''
-          return this.dot(
-            obj[key],
-            tgt,
-            path.slice(0, -1).concat(previousKey + index)
-          )
-        } else {
-          return this.dot(obj[key], tgt, path.concat(index))
-        }
-      } else {
-        if (isArray && this.useBrackets) {
-          tgt[path.join(this.separator).concat('[' + key + ']')] = obj[key]
-        } else {
-          tgt[path.concat(index).join(this.separator)] = obj[key]
-        }
-      }
-    }.bind(this)
-  )
-  return tgt
-}
-
-DotObject.pick = wrap('pick')
-DotObject.move = wrap('move')
-DotObject.transfer = wrap('transfer')
-DotObject.transform = wrap('transform')
-DotObject.copy = wrap('copy')
-DotObject.object = wrap('object')
-DotObject.str = wrap('str')
-DotObject.set = wrap('set')
-DotObject.delete = wrap('delete')
-DotObject.del = DotObject.remove = wrap('remove')
-DotObject.dot = wrap('dot');
-['override', 'overwrite'].forEach(function (prop) {
-  Object.defineProperty(DotObject, prop, {
-    get: function () {
-      return dotDefault.override
-    },
-    set: function (val) {
-      dotDefault.override = !!val
-    }
-  })
-});
-['useArray', 'keepArray', 'useBrackets'].forEach(function (prop) {
-  Object.defineProperty(DotObject, prop, {
-    get: function () {
-      return dotDefault[prop]
-    },
-    set: function (val) {
-      dotDefault[prop] = val
-    }
-  })
-})
-
-DotObject._process = _process
-
-module.exports = DotObject
-
-
 /***/ }),
 
 /***/ 3287:
@@ -68446,1152 +66729,6 @@ if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) {
 exports.debug = debug; // for test
 
 
-/***/ }),
-
-/***/ 1524:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-
-
-/***/ }),
-
-/***/ 6647:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.isValidErrorCode = exports.httpStatusFromErrorCode = exports.TwirpErrorCode = exports.BadRouteError = exports.InternalServerErrorWith = exports.InternalServerError = exports.RequiredArgumentError = exports.InvalidArgumentError = exports.NotFoundError = exports.TwirpError = void 0;
-/**
- * Represents a twirp error
- */
-class TwirpError extends Error {
-    constructor(code, msg) {
-        super(msg);
-        this.code = TwirpErrorCode.Internal;
-        this.meta = {};
-        this.code = code;
-        this.msg = msg;
-        Object.setPrototypeOf(this, TwirpError.prototype);
-    }
-    /**
-     * Adds a metadata kv to the error
-     * @param key
-     * @param value
-     */
-    withMeta(key, value) {
-        this.meta[key] = value;
-        return this;
-    }
-    /**
-     * Returns a single metadata value
-     * return "" if not found
-     * @param key
-     */
-    getMeta(key) {
-        return this.meta[key] || "";
-    }
-    /**
-     * Add the original error cause
-     * @param err
-     * @param addMeta
-     */
-    withCause(err, addMeta = false) {
-        this._originalCause = err;
-        if (addMeta) {
-            this.withMeta("cause", err.message);
-        }
-        return this;
-    }
-    cause() {
-        return this._originalCause;
-    }
-    /**
-     * Returns the error representation to JSON
-     */
-    toJSON() {
-        try {
-            return JSON.stringify({
-                code: this.code,
-                msg: this.msg,
-                meta: this.meta,
-            });
-        }
-        catch (e) {
-            return `{"code": "internal", "msg": "There was an error but it could not be serialized into JSON"}`;
-        }
-    }
-    /**
-     * Create a twirp error from an object
-     * @param obj
-     */
-    static fromObject(obj) {
-        const code = obj["code"] || TwirpErrorCode.Unknown;
-        const msg = obj["msg"] || "unknown";
-        const error = new TwirpError(code, msg);
-        if (obj["meta"]) {
-            Object.keys(obj["meta"]).forEach((key) => {
-                error.withMeta(key, obj["meta"][key]);
-            });
-        }
-        return error;
-    }
-}
-exports.TwirpError = TwirpError;
-/**
- * NotFoundError constructor for the common NotFound error.
- */
-class NotFoundError extends TwirpError {
-    constructor(msg) {
-        super(TwirpErrorCode.NotFound, msg);
-    }
-}
-exports.NotFoundError = NotFoundError;
-/**
- * InvalidArgumentError constructor for the common InvalidArgument error. Can be
- * used when an argument has invalid format, is a number out of range, is a bad
- * option, etc).
- */
-class InvalidArgumentError extends TwirpError {
-    constructor(argument, validationMsg) {
-        super(TwirpErrorCode.InvalidArgument, argument + " " + validationMsg);
-        this.withMeta("argument", argument);
-    }
-}
-exports.InvalidArgumentError = InvalidArgumentError;
-/**
- * RequiredArgumentError is a more specific constructor for InvalidArgument
- * error. Should be used when the argument is required (expected to have a
- * non-zero value).
- */
-class RequiredArgumentError extends InvalidArgumentError {
-    constructor(argument) {
-        super(argument, "is required");
-    }
-}
-exports.RequiredArgumentError = RequiredArgumentError;
-/**
- * InternalError constructor for the common Internal error. Should be used to
- * specify that something bad or unexpected happened.
- */
-class InternalServerError extends TwirpError {
-    constructor(msg) {
-        super(TwirpErrorCode.Internal, msg);
-    }
-}
-exports.InternalServerError = InternalServerError;
-/**
- * InternalErrorWith makes an internal error, wrapping the original error and using it
- * for the error message, and with metadata "cause" with the original error type.
- * This function is used by Twirp services to wrap non-Twirp errors as internal errors.
- * The wrapped error can be extracted later with err.cause()
- */
-class InternalServerErrorWith extends InternalServerError {
-    constructor(err) {
-        super(err.message);
-        this.withMeta("cause", err.name);
-        this.withCause(err);
-    }
-}
-exports.InternalServerErrorWith = InternalServerErrorWith;
-/**
- * A standard BadRoute Error
- */
-class BadRouteError extends TwirpError {
-    constructor(msg, method, url) {
-        super(TwirpErrorCode.BadRoute, msg);
-        this.withMeta("twirp_invalid_route", method + " " + url);
-    }
-}
-exports.BadRouteError = BadRouteError;
-var TwirpErrorCode;
-(function (TwirpErrorCode) {
-    // Canceled indicates the operation was cancelled (typically by the caller).
-    TwirpErrorCode["Canceled"] = "canceled";
-    // Unknown error. For example when handling errors raised by APIs that do not
-    // return enough error information.
-    TwirpErrorCode["Unknown"] = "unknown";
-    // InvalidArgument indicates client specified an invalid argument. It
-    // indicates arguments that are problematic regardless of the state of the
-    // system (i.e. a malformed file name, required argument, number out of range,
-    // etc.).
-    TwirpErrorCode["InvalidArgument"] = "invalid_argument";
-    // Malformed indicates an error occurred while decoding the client's request.
-    // This may mean that the message was encoded improperly, or that there is a
-    // disagreement in message format between the client and server.
-    TwirpErrorCode["Malformed"] = "malformed";
-    // DeadlineExceeded means operation expired before completion. For operations
-    // that change the state of the system, this error may be returned even if the
-    // operation has completed successfully (timeout).
-    TwirpErrorCode["DeadlineExceeded"] = "deadline_exceeded";
-    // NotFound means some requested entity was not found.
-    TwirpErrorCode["NotFound"] = "not_found";
-    // BadRoute means that the requested URL path wasn't routable to a Twirp
-    // service and method. This is returned by the generated server, and usually
-    // shouldn't be returned by applications. Instead, applications should use
-    // NotFound or Unimplemented.
-    TwirpErrorCode["BadRoute"] = "bad_route";
-    // AlreadyExists means an attempt to create an entity failed because one
-    // already exists.
-    TwirpErrorCode["AlreadyExists"] = "already_exists";
-    // PermissionDenied indicates the caller does not have permission to execute
-    // the specified operation. It must not be used if the caller cannot be
-    // identified (Unauthenticated).
-    TwirpErrorCode["PermissionDenied"] = "permission_denied";
-    // Unauthenticated indicates the request does not have valid authentication
-    // credentials for the operation.
-    TwirpErrorCode["Unauthenticated"] = "unauthenticated";
-    // ResourceExhausted indicates some resource has been exhausted, perhaps a
-    // per-user quota, or perhaps the entire file system is out of space.
-    TwirpErrorCode["ResourceExhausted"] = "resource_exhausted";
-    // FailedPrecondition indicates operation was rejected because the system is
-    // not in a state required for the operation's execution. For example, doing
-    // an rmdir operation on a directory that is non-empty, or on a non-directory
-    // object, or when having conflicting read-modify-write on the same resource.
-    TwirpErrorCode["FailedPrecondition"] = "failed_precondition";
-    // Aborted indicates the operation was aborted, typically due to a concurrency
-    // issue like sequencer check failures, transaction aborts, etc.
-    TwirpErrorCode["Aborted"] = "aborted";
-    // OutOfRange means operation was attempted past the valid range. For example,
-    // seeking or reading past end of a paginated collection.
-    //
-    // Unlike InvalidArgument, this error indicates a problem that may be fixed if
-    // the system state changes (i.e. adding more items to the collection).
-    //
-    // There is a fair bit of overlap between FailedPrecondition and OutOfRange.
-    // We recommend using OutOfRange (the more specific error) when it applies so
-    // that callers who are iterating through a space can easily look for an
-    // OutOfRange error to detect when they are done.
-    TwirpErrorCode["OutOfRange"] = "out_of_range";
-    // Unimplemented indicates operation is not implemented or not
-    // supported/enabled in this service.
-    TwirpErrorCode["Unimplemented"] = "unimplemented";
-    // Internal errors. When some invariants expected by the underlying system
-    // have been broken. In other words, something bad happened in the library or
-    // backend service. Do not confuse with HTTP Internal Server Error; an
-    // Internal error could also happen on the client code, i.e. when parsing a
-    // server response.
-    TwirpErrorCode["Internal"] = "internal";
-    // Unavailable indicates the service is currently unavailable. This is a most
-    // likely a transient condition and may be corrected by retrying with a
-    // backoff.
-    TwirpErrorCode["Unavailable"] = "unavailable";
-    // DataLoss indicates unrecoverable data loss or corruption.
-    TwirpErrorCode["DataLoss"] = "data_loss";
-})(TwirpErrorCode = exports.TwirpErrorCode || (exports.TwirpErrorCode = {}));
-// ServerHTTPStatusFromErrorCode maps a Twirp error type into a similar HTTP
-// response status. It is used by the Twirp server handler to set the HTTP
-// response status code. Returns 0 if the ErrorCode is invalid.
-function httpStatusFromErrorCode(code) {
-    switch (code) {
-        case TwirpErrorCode.Canceled:
-            return 408; // RequestTimeout
-        case TwirpErrorCode.Unknown:
-            return 500; // Internal Server Error
-        case TwirpErrorCode.InvalidArgument:
-            return 400; // BadRequest
-        case TwirpErrorCode.Malformed:
-            return 400; // BadRequest
-        case TwirpErrorCode.DeadlineExceeded:
-            return 408; // RequestTimeout
-        case TwirpErrorCode.NotFound:
-            return 404; // Not Found
-        case TwirpErrorCode.BadRoute:
-            return 404; // Not Found
-        case TwirpErrorCode.AlreadyExists:
-            return 409; // Conflict
-        case TwirpErrorCode.PermissionDenied:
-            return 403; // Forbidden
-        case TwirpErrorCode.Unauthenticated:
-            return 401; // Unauthorized
-        case TwirpErrorCode.ResourceExhausted:
-            return 429; // Too Many Requests
-        case TwirpErrorCode.FailedPrecondition:
-            return 412; // Precondition Failed
-        case TwirpErrorCode.Aborted:
-            return 409; // Conflict
-        case TwirpErrorCode.OutOfRange:
-            return 400; // Bad Request
-        case TwirpErrorCode.Unimplemented:
-            return 501; // Not Implemented
-        case TwirpErrorCode.Internal:
-            return 500; // Internal Server Error
-        case TwirpErrorCode.Unavailable:
-            return 503; // Service Unavailable
-        case TwirpErrorCode.DataLoss:
-            return 500; // Internal Server Error
-        default:
-            return 0; // Invalid!
-    }
-}
-exports.httpStatusFromErrorCode = httpStatusFromErrorCode;
-// IsValidErrorCode returns true if is one of the valid predefined constants.
-function isValidErrorCode(code) {
-    return httpStatusFromErrorCode(code) != 0;
-}
-exports.isValidErrorCode = isValidErrorCode;
-
-
-/***/ }),
-
-/***/ 6748:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
-
-"use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-var __rest = (this && this.__rest) || function (s, e) {
-    var t = {};
-    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
-        t[p] = s[p];
-    if (s != null && typeof Object.getOwnPropertySymbols === "function")
-        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
-            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
-                t[p[i]] = s[p[i]];
-        }
-    return t;
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.Gateway = exports.Pattern = void 0;
-const querystring_1 = __nccwpck_require__(3477);
-const dotObject = __importStar(__nccwpck_require__(4365));
-const request_1 = __nccwpck_require__(8347);
-const errors_1 = __nccwpck_require__(6647);
-const http_client_1 = __nccwpck_require__(4091);
-const server_1 = __nccwpck_require__(6604);
-var Pattern;
-(function (Pattern) {
-    Pattern["POST"] = "post";
-    Pattern["GET"] = "get";
-    Pattern["PATCH"] = "patch";
-    Pattern["PUT"] = "put";
-    Pattern["DELETE"] = "delete";
-})(Pattern = exports.Pattern || (exports.Pattern = {}));
-/**
- * The Gateway proxies http requests to Twirp Compliant
- * handlers
- */
-class Gateway {
-    constructor(routes) {
-        this.routes = routes;
-    }
-    /**
-     * Middleware that rewrite the current request
-     * to a Twirp compliant request
-     */
-    twirpRewrite(prefix = "/twirp") {
-        return (req, resp, next) => {
-            this.rewrite(req, resp, prefix)
-                .then(() => next())
-                .catch((e) => {
-                if (e instanceof errors_1.TwirpError) {
-                    if (e.code !== errors_1.TwirpErrorCode.NotFound) {
-                        server_1.writeError(resp, e);
-                    }
-                    else {
-                        next();
-                    }
-                }
-            });
-        };
-    }
-    /**
-     * Rewrite an incoming request to a Twirp compliant request
-     * @param req
-     * @param resp
-     * @param prefix
-     */
-    rewrite(req, resp, prefix = "/twirp") {
-        return __awaiter(this, void 0, void 0, function* () {
-            const [match, route] = this.matchRoute(req);
-            const body = yield this.prepareTwirpBody(req, match, route);
-            const twirpUrl = `${prefix}/${route.packageName}.${route.serviceName}/${route.methodName}`;
-            req.url = twirpUrl;
-            req.originalUrl = twirpUrl;
-            req.method = "POST";
-            req.headers["content-type"] = "application/json";
-            req.rawBody = Buffer.from(JSON.stringify(body));
-            if (route.responseBodyKey) {
-                const endFn = resp.end.bind(resp);
-                resp.end = function (chunk) {
-                    if (resp.statusCode === 200) {
-                        endFn(`{ "${route.responseBodyKey}": ${chunk} }`);
-                    }
-                    else {
-                        endFn(chunk);
-                    }
-                };
-            }
-        });
-    }
-    /**
-     * Create a reverse proxy handler to
-     * proxy http requests to Twirp Compliant handlers
-     * @param httpClientOption
-     */
-    reverseProxy(httpClientOption) {
-        const client = http_client_1.NodeHttpRPC(httpClientOption);
-        return (req, res) => __awaiter(this, void 0, void 0, function* () {
-            try {
-                const [match, route] = this.matchRoute(req);
-                const body = yield this.prepareTwirpBody(req, match, route);
-                const response = yield client.request(`${route.packageName}.${route.serviceName}`, route.methodName, "application/json", body);
-                res.statusCode = 200;
-                res.setHeader("content-type", "application/json");
-                let jsonResponse;
-                if (route.responseBodyKey) {
-                    jsonResponse = JSON.stringify({ [route.responseBodyKey]: response });
-                }
-                else {
-                    jsonResponse = JSON.stringify(response);
-                }
-                res.end(jsonResponse);
-            }
-            catch (e) {
-                server_1.writeError(res, e);
-            }
-        });
-    }
-    /**
-     * Prepares twirp body requests using http.google.annotions
-     * compliant spec
-     *
-     * @param req
-     * @param match
-     * @param route
-     * @protected
-     */
-    prepareTwirpBody(req, match, route) {
-        return __awaiter(this, void 0, void 0, function* () {
-            const _a = match.params, { query_string } = _a, params = __rest(_a, ["query_string"]);
-            let requestBody = Object.assign({}, params);
-            if (query_string && route.bodyKey !== "*") {
-                const queryParams = this.parseQueryString(query_string);
-                requestBody = Object.assign(Object.assign({}, queryParams), requestBody);
-            }
-            let body = {};
-            if (route.bodyKey) {
-                const data = yield request_1.getRequestData(req);
-                try {
-                    const jsonBody = JSON.parse(data.toString() || "{}");
-                    if (route.bodyKey === "*") {
-                        body = jsonBody;
-                    }
-                    else {
-                        body[route.bodyKey] = jsonBody;
-                    }
-                }
-                catch (e) {
-                    const msg = "the json request could not be decoded";
-                    throw new errors_1.TwirpError(errors_1.TwirpErrorCode.Malformed, msg).withCause(e, true);
-                }
-            }
-            return Object.assign(Object.assign({}, body), requestBody);
-        });
-    }
-    /**
-     * Matches a route
-     * @param req
-     */
-    matchRoute(req) {
-        var _a;
-        const httpMethod = (_a = req.method) === null || _a === void 0 ? void 0 : _a.toLowerCase();
-        if (!httpMethod) {
-            throw new errors_1.BadRouteError(`method not allowed`, req.method || "", req.url || "");
-        }
-        const routes = this.routes[httpMethod];
-        for (const route of routes) {
-            const match = route.matcher(req.url || "/");
-            if (match) {
-                return [match, route];
-            }
-        }
-        throw new errors_1.NotFoundError(`url ${req.url} not found`);
-    }
-    /**
-     * Parse query string
-     * @param queryString
-     */
-    parseQueryString(queryString) {
-        const queryParams = querystring_1.parse(queryString.replace("?", ""));
-        return dotObject.object(queryParams);
-    }
-}
-exports.Gateway = Gateway;
-
-
-/***/ }),
-
-/***/ 4263:
-/***/ (function(__unused_webpack_module, exports) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.isHook = exports.chainHooks = void 0;
-// ChainHooks creates a new ServerHook which chains the callbacks in
-// each of the constituent hooks passed in. Each hook function will be
-// called in the order of the ServerHooks values passed in.
-//
-// For the erroring hooks, RequestReceived and RequestRouted, any returned
-// errors prevent processing by later hooks.
-function chainHooks(...hooks) {
-    if (hooks.length === 0) {
-        return null;
-    }
-    if (hooks.length === 1) {
-        return hooks[0];
-    }
-    const serverHook = {
-        requestReceived(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.requestReceived) {
-                        continue;
-                    }
-                    yield hook.requestReceived(ctx);
-                }
-            });
-        },
-        requestPrepared(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.requestPrepared) {
-                        continue;
-                    }
-                    console.warn("hook requestPrepared is deprecated and will be removed in the next release. " +
-                        "Please use responsePrepared instead.");
-                    yield hook.requestPrepared(ctx);
-                }
-            });
-        },
-        responsePrepared(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.responsePrepared) {
-                        continue;
-                    }
-                    yield hook.responsePrepared(ctx);
-                }
-            });
-        },
-        requestSent(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.requestSent) {
-                        continue;
-                    }
-                    console.warn("hook requestSent is deprecated and will be removed in the next release. " +
-                        "Please use responseSent instead.");
-                    yield hook.requestSent(ctx);
-                }
-            });
-        },
-        responseSent(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.responseSent) {
-                        continue;
-                    }
-                    yield hook.responseSent(ctx);
-                }
-            });
-        },
-        requestRouted(ctx) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.requestRouted) {
-                        continue;
-                    }
-                    yield hook.requestRouted(ctx);
-                }
-            });
-        },
-        error(ctx, err) {
-            return __awaiter(this, void 0, void 0, function* () {
-                for (const hook of hooks) {
-                    if (!hook.error) {
-                        continue;
-                    }
-                    yield hook.error(ctx, err);
-                }
-            });
-        },
-    };
-    return serverHook;
-}
-exports.chainHooks = chainHooks;
-function isHook(object) {
-    return ("requestReceived" in object ||
-        "requestPrepared" in object ||
-        "requestSent" in object ||
-        "requestRouted" in object ||
-        "responsePrepared" in object ||
-        "responseSent" in object ||
-        "error" in object);
-}
-exports.isHook = isHook;
-
-
-/***/ }),
-
-/***/ 4091:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
-
-"use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.FetchRPC = exports.wrapErrorResponseToTwirpError = exports.NodeHttpRPC = void 0;
-const http = __importStar(__nccwpck_require__(3685));
-const https = __importStar(__nccwpck_require__(5687));
-const url_1 = __nccwpck_require__(7310);
-const errors_1 = __nccwpck_require__(6647);
-/**
- * a node HTTP RPC implementation
- * @param options
- * @constructor
- */
-const NodeHttpRPC = (options) => ({
-    request(service, method, contentType, data) {
-        let client;
-        return new Promise((resolve, rejected) => {
-            const responseChunks = [];
-            const requestData = contentType === "application/protobuf"
-                ? Buffer.from(data)
-                : JSON.stringify(data);
-            const url = new url_1.URL(options.baseUrl);
-            const isHttps = url.protocol === "https:";
-            if (isHttps) {
-                client = https;
-            }
-            else {
-                client = http;
-            }
-            const prefix = url.pathname !== "/" ? url.pathname : "";
-            const req = client
-                .request(Object.assign(Object.assign({}, (options ? options : {})), { method: "POST", protocol: url.protocol, host: url.hostname, port: url.port ? url.port : isHttps ? 443 : 80, path: `${prefix}/${service}/${method}`, headers: Object.assign(Object.assign({}, (options.headers ? options.headers : {})), { "Content-Type": contentType, "Content-Length": contentType === "application/protobuf"
-                        ? Buffer.byteLength(requestData)
-                        : Buffer.from(requestData).byteLength }) }), (res) => {
-                res.on("data", (chunk) => responseChunks.push(chunk));
-                res.on("end", () => {
-                    const data = Buffer.concat(responseChunks);
-                    if (res.statusCode != 200) {
-                        rejected(wrapErrorResponseToTwirpError(data.toString()));
-                    }
-                    else {
-                        if (contentType === "application/json") {
-                            resolve(JSON.parse(data.toString()));
-                        }
-                        else {
-                            resolve(data);
-                        }
-                    }
-                });
-                res.on("error", (err) => {
-                    rejected(err);
-                });
-            })
-                .on("error", (err) => {
-                rejected(err);
-            });
-            req.end(requestData);
-        });
-    },
-});
-exports.NodeHttpRPC = NodeHttpRPC;
-function wrapErrorResponseToTwirpError(errorResponse) {
-    return errors_1.TwirpError.fromObject(JSON.parse(errorResponse));
-}
-exports.wrapErrorResponseToTwirpError = wrapErrorResponseToTwirpError;
-/**
- * a browser fetch RPC implementation
- */
-const FetchRPC = (options) => ({
-    request(service, method, contentType, data) {
-        return __awaiter(this, void 0, void 0, function* () {
-            const headers = new Headers(options.headers);
-            headers.set("content-type", contentType);
-            const response = yield fetch(`${options.baseUrl}/${service}/${method}`, Object.assign(Object.assign({}, options), { method: "POST", headers, body: data instanceof Uint8Array ? data : JSON.stringify(data) }));
-            if (response.status === 200) {
-                if (contentType === "application/json") {
-                    return yield response.json();
-                }
-                return new Uint8Array(yield response.arrayBuffer());
-            }
-            throw errors_1.TwirpError.fromObject(yield response.json());
-        });
-    },
-});
-exports.FetchRPC = FetchRPC;
-
-
-/***/ }),
-
-/***/ 6465:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
-
-"use strict";
-
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __exportStar = (this && this.__exportStar) || function(m, exports) {
-    for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.TwirpContentType = void 0;
-__exportStar(__nccwpck_require__(1524), exports);
-__exportStar(__nccwpck_require__(6604), exports);
-__exportStar(__nccwpck_require__(8913), exports);
-__exportStar(__nccwpck_require__(4263), exports);
-__exportStar(__nccwpck_require__(6647), exports);
-__exportStar(__nccwpck_require__(6748), exports);
-__exportStar(__nccwpck_require__(4091), exports);
-var request_1 = __nccwpck_require__(8347);
-Object.defineProperty(exports, "TwirpContentType", ({ enumerable: true, get: function () { return request_1.TwirpContentType; } }));
-
-
-/***/ }),
-
-/***/ 8913:
-/***/ (function(__unused_webpack_module, exports) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.chainInterceptors = void 0;
-// chains multiple Interceptors into a single Interceptor.
-// The first interceptor wraps the second one, and so on.
-// Returns null if interceptors is empty.
-function chainInterceptors(...interceptors) {
-    if (interceptors.length === 0) {
-        return;
-    }
-    if (interceptors.length === 1) {
-        return interceptors[0];
-    }
-    const first = interceptors[0];
-    return (ctx, request, handler) => __awaiter(this, void 0, void 0, function* () {
-        let next = handler;
-        for (let i = interceptors.length - 1; i > 0; i--) {
-            next = ((next) => (ctx, typedRequest) => {
-                return interceptors[i](ctx, typedRequest, next);
-            })(next);
-        }
-        return first(ctx, request, next);
-    });
-}
-exports.chainInterceptors = chainInterceptors;
-
-
-/***/ }),
-
-/***/ 8347:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.parseTwirpPath = exports.getRequestData = exports.validateRequest = exports.getContentType = exports.TwirpContentType = void 0;
-const errors_1 = __nccwpck_require__(6647);
-/**
- * Supported Twirp Content-Type
- */
-var TwirpContentType;
-(function (TwirpContentType) {
-    TwirpContentType[TwirpContentType["Protobuf"] = 0] = "Protobuf";
-    TwirpContentType[TwirpContentType["JSON"] = 1] = "JSON";
-    TwirpContentType[TwirpContentType["Unknown"] = 2] = "Unknown";
-})(TwirpContentType = exports.TwirpContentType || (exports.TwirpContentType = {}));
-/**
- * Get supported content-type
- * @param mimeType
- */
-function getContentType(mimeType) {
-    switch (mimeType) {
-        case "application/protobuf":
-            return TwirpContentType.Protobuf;
-        case "application/json":
-            return TwirpContentType.JSON;
-        default:
-            return TwirpContentType.Unknown;
-    }
-}
-exports.getContentType = getContentType;
-/**
- * Validate a twirp request
- * @param ctx
- * @param request
- * @param pathPrefix
- */
-function validateRequest(ctx, request, pathPrefix) {
-    if (request.method !== "POST") {
-        const msg = `unsupported method ${request.method} (only POST is allowed)`;
-        throw new errors_1.BadRouteError(msg, request.method || "", request.url || "");
-    }
-    const path = parseTwirpPath(request.url || "");
-    if (path.pkgService !==
-        (ctx.packageName ? ctx.packageName + "." : "") + ctx.serviceName) {
-        const msg = `no handler for path ${request.url}`;
-        throw new errors_1.BadRouteError(msg, request.method || "", request.url || "");
-    }
-    if (path.prefix !== pathPrefix) {
-        const msg = `invalid path prefix ${path.prefix}, expected ${pathPrefix}, on path ${request.url}`;
-        throw new errors_1.BadRouteError(msg, request.method || "", request.url || "");
-    }
-    const mimeContentType = request.headers["content-type"] || "";
-    if (ctx.contentType === TwirpContentType.Unknown) {
-        const msg = `unexpected Content-Type: ${request.headers["content-type"]}`;
-        throw new errors_1.BadRouteError(msg, request.method || "", request.url || "");
-    }
-    return Object.assign(Object.assign({}, path), { mimeContentType, contentType: ctx.contentType });
-}
-exports.validateRequest = validateRequest;
-/**
- * Get request data from the body
- * @param req
- */
-function getRequestData(req) {
-    return new Promise((resolve, reject) => {
-        const reqWithRawBody = req;
-        if (reqWithRawBody.rawBody instanceof Buffer) {
-            resolve(reqWithRawBody.rawBody);
-            return;
-        }
-        const chunks = [];
-        req.on("data", (chunk) => chunks.push(chunk));
-        req.on("end", () => __awaiter(this, void 0, void 0, function* () {
-            const data = Buffer.concat(chunks);
-            resolve(data);
-        }));
-        req.on("error", (err) => {
-            if (req.aborted) {
-                reject(new errors_1.TwirpError(errors_1.TwirpErrorCode.DeadlineExceeded, "failed to read request: deadline exceeded"));
-            }
-            else {
-                reject(new errors_1.TwirpError(errors_1.TwirpErrorCode.Malformed, err.message).withCause(err));
-            }
-        });
-        req.on("close", () => {
-            reject(new errors_1.TwirpError(errors_1.TwirpErrorCode.Canceled, "failed to read request: context canceled"));
-        });
-    });
-}
-exports.getRequestData = getRequestData;
-/**
- * Parses twirp url path
- * @param path
- */
-function parseTwirpPath(path) {
-    const parts = path.split("/");
-    if (parts.length < 2) {
-        return {
-            pkgService: "",
-            method: "",
-            prefix: "",
-        };
-    }
-    return {
-        method: parts[parts.length - 1],
-        pkgService: parts[parts.length - 2],
-        prefix: parts.slice(0, parts.length - 2).join("/"),
-    };
-}
-exports.parseTwirpPath = parseTwirpPath;
-
-
-/***/ }),
-
-/***/ 6604:
-/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
-
-"use strict";
-
-var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
-    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
-    return new (P || (P = Promise))(function (resolve, reject) {
-        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
-        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
-        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
-        step((generator = generator.apply(thisArg, _arguments || [])).next());
-    });
-};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.writeError = exports.TwirpServer = void 0;
-const hooks_1 = __nccwpck_require__(4263);
-const request_1 = __nccwpck_require__(8347);
-const errors_1 = __nccwpck_require__(6647);
-/**
- * Runtime server implementation of a TwirpServer
- */
-class TwirpServer {
-    constructor(options) {
-        this.pathPrefix = "/twirp";
-        this.hooks = [];
-        this.interceptors = [];
-        this.packageName = options.packageName;
-        this.serviceName = options.serviceName;
-        this.methodList = options.methodList;
-        this.matchRoute = options.matchRoute;
-        this.service = options.service;
-    }
-    /**
-     * Returns the prefix for this server
-     */
-    get prefix() {
-        return this.pathPrefix;
-    }
-    /**
-     * The http handler for twirp complaint endpoints
-     * @param options
-     */
-    httpHandler(options) {
-        return (req, resp) => {
-            // setup prefix
-            if ((options === null || options === void 0 ? void 0 : options.prefix) !== undefined) {
-                this.withPrefix(options.prefix);
-            }
-            return this._httpHandler(req, resp);
-        };
-    }
-    /**
-     * Adds interceptors or hooks to the request stack
-     * @param middlewares
-     */
-    use(...middlewares) {
-        middlewares.forEach((middleware) => {
-            if (hooks_1.isHook(middleware)) {
-                this.hooks.push(middleware);
-                return this;
-            }
-            this.interceptors.push(middleware);
-        });
-        return this;
-    }
-    /**
-     * Adds a prefix to the service url path
-     * @param prefix
-     */
-    withPrefix(prefix) {
-        if (prefix === false) {
-            this.pathPrefix = "";
-        }
-        else {
-            this.pathPrefix = prefix;
-        }
-        return this;
-    }
-    /**
-     * Returns the regex matching path for this twirp server
-     */
-    matchingPath() {
-        const baseRegex = this.baseURI().replace(/\./g, "\\.");
-        return new RegExp(`${baseRegex}\/(${this.methodList.join("|")})`);
-    }
-    /**
-     * Returns the base URI for this twirp server
-     */
-    baseURI() {
-        return `${this.pathPrefix}/${this.packageName ? this.packageName + "." : ""}${this.serviceName}`;
-    }
-    /**
-     * Create a twirp context
-     * @param req
-     * @param res
-     * @private
-     */
-    createContext(req, res) {
-        return {
-            packageName: this.packageName,
-            serviceName: this.serviceName,
-            methodName: "",
-            contentType: request_1.getContentType(req.headers["content-type"]),
-            req: req,
-            res: res,
-        };
-    }
-    /**
-     * Twrip server http handler implementation
-     * @param req
-     * @param resp
-     * @private
-     */
-    _httpHandler(req, resp) {
-        return __awaiter(this, void 0, void 0, function* () {
-            const ctx = this.createContext(req, resp);
-            try {
-                yield this.invokeHook("requestReceived", ctx);
-                const { method, mimeContentType } = request_1.validateRequest(ctx, req, this.pathPrefix || "");
-                const handler = this.matchRoute(method, {
-                    onMatch: (ctx) => {
-                        return this.invokeHook("requestRouted", ctx);
-                    },
-                    onNotFound: () => {
-                        const msg = `no handler for path ${req.url}`;
-                        throw new errors_1.BadRouteError(msg, req.method || "", req.url || "");
-                    },
-                });
-                const body = yield request_1.getRequestData(req);
-                const response = yield handler(ctx, this.service, body, this.interceptors);
-                yield Promise.all([
-                    this.invokeHook("responsePrepared", ctx),
-                    // keep backwards compatibility till next release
-                    this.invokeHook("requestPrepared", ctx),
-                ]);
-                resp.statusCode = 200;
-                resp.setHeader("Content-Type", mimeContentType);
-                resp.end(response);
-            }
-            catch (e) {
-                yield this.invokeHook("error", ctx, mustBeTwirpError(e));
-                if (!resp.headersSent) {
-                    writeError(resp, e);
-                }
-            }
-            finally {
-                yield Promise.all([
-                    this.invokeHook("responseSent", ctx),
-                    // keep backwards compatibility till next release
-                    this.invokeHook("requestSent", ctx),
-                ]);
-            }
-        });
-    }
-    /**
-     * Invoke a hook
-     * @param hookName
-     * @param ctx
-     * @param err
-     * @protected
-     */
-    invokeHook(hookName, ctx, err) {
-        return __awaiter(this, void 0, void 0, function* () {
-            if (this.hooks.length === 0) {
-                return;
-            }
-            const chainedHooks = hooks_1.chainHooks(...this.hooks);
-            const hook = chainedHooks === null || chainedHooks === void 0 ? void 0 : chainedHooks[hookName];
-            if (hook) {
-                yield hook(ctx, err || new errors_1.InternalServerError("internal server error"));
-            }
-        });
-    }
-}
-exports.TwirpServer = TwirpServer;
-/**
- * Write http error response
- * @param res
- * @param error
- */
-function writeError(res, error) {
-    const twirpError = mustBeTwirpError(error);
-    res.setHeader("Content-Type", "application/json");
-    res.statusCode = errors_1.httpStatusFromErrorCode(twirpError.code);
-    res.end(twirpError.toJSON());
-}
-exports.writeError = writeError;
-/**
- * Make sure that the error passed is a TwirpError
- * otherwise it will wrap it into an InternalError
- * @param err
- */
-function mustBeTwirpError(err) {
-    if (err instanceof errors_1.TwirpError) {
-        return err;
-    }
-    return new errors_1.InternalServerErrorWith(err);
-}
-
-
 /***/ }),
 
 /***/ 1773:
@@ -102968,7 +100105,7 @@ module.exports = parseParams
 /***/ ((module) => {
 
 "use strict";
-module.exports = JSON.parse('{"name":"@actions/cache","version":"4.0.0","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1","twirp-ts":"^2.5.0"},"devDependencies":{"@types/semver":"^6.0.0","typescript":"^5.2.2"}}');
+module.exports = JSON.parse('{"name":"@actions/cache","version":"4.0.2","preview":true,"description":"Actions cache lib","keywords":["github","actions","cache"],"homepage":"https://github.com/actions/toolkit/tree/main/packages/cache","license":"MIT","main":"lib/cache.js","types":"lib/cache.d.ts","directories":{"lib":"lib","test":"__tests__"},"files":["lib","!.DS_Store"],"publishConfig":{"access":"public"},"repository":{"type":"git","url":"git+https://github.com/actions/toolkit.git","directory":"packages/cache"},"scripts":{"audit-moderate":"npm install && npm audit --json --audit-level=moderate > audit.json","test":"echo \\"Error: run tests from root\\" && exit 1","tsc":"tsc"},"bugs":{"url":"https://github.com/actions/toolkit/issues"},"dependencies":{"@actions/core":"^1.11.1","@actions/exec":"^1.0.1","@actions/glob":"^0.1.0","@actions/http-client":"^2.1.1","@actions/io":"^1.0.1","@azure/abort-controller":"^1.1.0","@azure/ms-rest-js":"^2.6.0","@azure/storage-blob":"^12.13.0","@protobuf-ts/plugin":"^2.9.4","semver":"^6.3.1"},"devDependencies":{"@types/semver":"^6.0.0","typescript":"^5.2.2"}}');
 
 /***/ }),
 
diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md
index bf62e0713..ac61e64d9 100644
--- a/docs/advanced-usage.md
+++ b/docs/advanced-usage.md
@@ -1,3 +1,5 @@
+
+
 ## Working with lockfiles
 
 All supported package managers recommend that you **always** commit the lockfile, although implementations vary doing so generally provides the following benefits:
@@ -76,10 +78,10 @@ When using the `package.json` input, the action will look for `volta.node` first
 ```json
 {
   "engines": {
-    "node": ">=16.0.0"
+    "node": ">=18.0.0"
   },
   "volta": {
-    "node": "16.0.0"
+    "node": "22.0.0"
   }
 }
 ```
@@ -100,7 +102,7 @@ jobs:
       - uses: actions/checkout@v4
       - uses: actions/setup-node@v4
         with:
-          node-version: '14'
+          node-version: '22'
           architecture: 'x64' # optional, x64 or x86. If not specified, x64 will be used by default
       - run: npm ci
       - run: npm test
@@ -239,7 +241,7 @@ steps:
 - uses: actions/checkout@v4
 - uses: actions/setup-node@v4
   with:
-    node-version: '14'
+    node-version: '22'
     cache: 'yarn'
 - run: yarn install --frozen-lockfile # optional, --immutable
 - run: yarn test
@@ -261,7 +263,7 @@ steps:
     version: 6.32.9
 - uses: actions/setup-node@v4
   with:
-    node-version: '14'
+    node-version: '22'
     cache: 'pnpm'
 - run: pnpm install
 - run: pnpm test
@@ -277,7 +279,7 @@ steps:
 - uses: actions/checkout@v4
 - uses: actions/setup-node@v4
   with:
-    node-version: '14'
+    node-version: '22'
     cache: 'npm'
     cache-dependency-path: '**/package-lock.json'
 - run: npm ci
@@ -290,7 +292,7 @@ steps:
 - uses: actions/checkout@v4
 - uses: actions/setup-node@v4
   with:
-    node-version: '14'
+    node-version: '22'
     cache: 'npm'
     cache-dependency-path: |
       server/app/package-lock.json
@@ -312,9 +314,9 @@ jobs:
           - macos-latest
           - windows-latest
         node_version:
-          - 12
-          - 14
-          - 16
+          - 18
+          - 20
+          - 22
         architecture:
           - x64
         # an extra windows-x86 run:
@@ -340,7 +342,7 @@ steps:
 - uses: actions/checkout@v4
 - uses: actions/setup-node@v4
   with:
-    node-version: '14.x'
+    node-version: '22'
     registry-url: 'https://registry.npmjs.org'
 - run: npm ci
 - run: npm publish
@@ -360,7 +362,7 @@ steps:
 - uses: actions/checkout@v4
 - uses: actions/setup-node@v4
   with:
-    node-version: '14.x'
+    node-version: '22'
     registry-url: <registry url>
 - run: yarn install --frozen-lockfile
 - run: yarn publish
@@ -380,7 +382,7 @@ steps:
 - uses: actions/checkout@v4
 - uses: actions/setup-node@v4
   with:
-    node-version: '14.x'
+    node-version: '22'
     registry-url: 'https://registry.npmjs.org'
 # Skip post-install scripts here, as a malicious
 # script could steal NODE_AUTH_TOKEN.
@@ -418,3 +420,15 @@ Please refer to the [Ensuring workflow access to your package - Configuring a pa
 
 ### always-auth input
 The always-auth input sets `always-auth=true` in .npmrc file. With this option set [npm](https://docs.npmjs.com/cli/v6/using-npm/config#always-auth)/yarn sends the authentication credentials when making a request to the registries.
+
+### Using mirror-url
+You can use the new mirror-url parameter to specify a custom mirror for downloading node.js versions from a different location
+
+```yaml
+steps:
+  - uses: actions/checkout@v4
+  - uses: actions/setup-node@v4
+    with:
+      node-version: '22'
+      mirror-url: 'https://mirror.example.com/node'
+```
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 07f38dbbb..28f141ea2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
       "version": "4.0.0",
       "license": "MIT",
       "dependencies": {
-        "@actions/cache": "^4.0.0",
+        "@actions/cache": "^4.0.2",
         "@actions/core": "^1.11.1",
         "@actions/exec": "^1.1.1",
         "@actions/github": "^5.1.1",
@@ -49,9 +49,9 @@
       }
     },
     "node_modules/@actions/cache": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-4.0.0.tgz",
-      "integrity": "sha512-WIuxjnZ44lNYtIS4fqSaYvF00hORdy3cSin+jx8xNgBVGWnNIAiCBHjlwusVQlcgExoQC9pHXGrDsZyZr7rCDQ==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-4.0.2.tgz",
+      "integrity": "sha512-cBr7JL1q+JKjbBd3w3SZN5OQ1Xg+/D8QLMcE7MpgpghZlL4biBO0ZEeraoTxCZyfN0YY0dxXlLgsgGv/sT5BTg==",
       "license": "MIT",
       "dependencies": {
         "@actions/core": "^1.11.1",
@@ -63,8 +63,7 @@
         "@azure/ms-rest-js": "^2.6.0",
         "@azure/storage-blob": "^12.13.0",
         "@protobuf-ts/plugin": "^2.9.4",
-        "semver": "^6.3.1",
-        "twirp-ts": "^2.5.0"
+        "semver": "^6.3.1"
       }
     },
     "node_modules/@actions/cache/node_modules/@actions/glob": {
@@ -2488,16 +2487,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/camel-case": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
-      "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
-      "license": "MIT",
-      "dependencies": {
-        "pascal-case": "^3.1.2",
-        "tslib": "^2.0.3"
-      }
-    },
     "node_modules/camelcase": {
       "version": "5.3.1",
       "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -2632,15 +2621,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/commander": {
-      "version": "6.2.1",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
-      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2788,19 +2768,6 @@
         "node": ">=6.0.0"
       }
     },
-    "node_modules/dot-object": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/dot-object/-/dot-object-2.1.5.tgz",
-      "integrity": "sha512-xHF8EP4XH/Ba9fvAF2LDd5O3IITVolerVV6xvkxoM8zlGEiCUrggpAnHyOoKJKCrhvPcGATFAUwIujj7bRG5UA==",
-      "license": "MIT",
-      "dependencies": {
-        "commander": "^6.1.0",
-        "glob": "^7.1.6"
-      },
-      "bin": {
-        "dot-object": "bin/dot-object"
-      }
-    },
     "node_modules/electron-to-chromium": {
       "version": "1.4.563",
       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz",
@@ -3363,7 +3330,8 @@
     "node_modules/fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+      "dev": true
     },
     "node_modules/fsevents": {
       "version": "2.3.3",
@@ -3431,6 +3399,7 @@
       "version": "7.2.3",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
       "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "dev": true,
       "dependencies": {
         "fs.realpath": "^1.0.0",
         "inflight": "^1.0.4",
@@ -3598,6 +3567,7 @@
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dev": true,
       "dependencies": {
         "once": "^1.3.0",
         "wrappy": "1"
@@ -3606,7 +3576,8 @@
     "node_modules/inherits": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "dev": true
     },
     "node_modules/is-arrayish": {
       "version": "0.2.1",
@@ -4457,12 +4428,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/lodash": {
-      "version": "4.17.21",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
-      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
-      "license": "MIT"
-    },
     "node_modules/lodash.memoize": {
       "version": "4.1.2",
       "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
@@ -4475,15 +4440,6 @@
       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
       "dev": true
     },
-    "node_modules/lower-case": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
-      "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
-      "license": "MIT",
-      "dependencies": {
-        "tslib": "^2.0.3"
-      }
-    },
     "node_modules/lru-cache": {
       "version": "5.1.1",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -4608,16 +4564,6 @@
       "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
       "dev": true
     },
-    "node_modules/no-case": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
-      "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
-      "license": "MIT",
-      "dependencies": {
-        "lower-case": "^2.0.2",
-        "tslib": "^2.0.3"
-      }
-    },
     "node_modules/node-fetch": {
       "version": "2.7.0",
       "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
@@ -4779,16 +4725,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/pascal-case": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
-      "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
-      "license": "MIT",
-      "dependencies": {
-        "no-case": "^3.0.4",
-        "tslib": "^2.0.3"
-      }
-    },
     "node_modules/path-exists": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -4802,6 +4738,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
       "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "dev": true,
       "engines": {
         "node": ">=0.10.0"
       }
@@ -4821,12 +4758,6 @@
       "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
       "dev": true
     },
-    "node_modules/path-to-regexp": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
-      "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
-      "license": "MIT"
-    },
     "node_modules/path-type": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
@@ -4940,6 +4871,7 @@
       "version": "2.8.8",
       "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
       "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+      "dev": true,
       "bin": {
         "prettier": "bin-prettier.js"
       },
@@ -5466,16 +5398,6 @@
         }
       }
     },
-    "node_modules/ts-poet": {
-      "version": "4.15.0",
-      "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-4.15.0.tgz",
-      "integrity": "sha512-sLLR8yQBvHzi9d4R1F4pd+AzQxBfzOSSjfxiJxQhkUoH5bL7RsAC6wgvtVUQdGqiCsyS9rT6/8X2FI7ipdir5g==",
-      "license": "Apache-2.0",
-      "dependencies": {
-        "lodash": "^4.17.15",
-        "prettier": "^2.5.1"
-      }
-    },
     "node_modules/tslib": {
       "version": "2.6.2",
       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
@@ -5510,35 +5432,6 @@
         "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
       }
     },
-    "node_modules/twirp-ts": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/twirp-ts/-/twirp-ts-2.5.0.tgz",
-      "integrity": "sha512-JTKIK5Pf/+3qCrmYDFlqcPPUx+ohEWKBaZy8GL8TmvV2VvC0SXVyNYILO39+GCRbqnuP6hBIF+BVr8ZxRz+6fw==",
-      "license": "MIT",
-      "dependencies": {
-        "@protobuf-ts/plugin-framework": "^2.0.7",
-        "camel-case": "^4.1.2",
-        "dot-object": "^2.1.4",
-        "path-to-regexp": "^6.2.0",
-        "ts-poet": "^4.5.0",
-        "yaml": "^1.10.2"
-      },
-      "bin": {
-        "protoc-gen-twirp_ts": "protoc-gen-twirp_ts"
-      },
-      "peerDependencies": {
-        "@protobuf-ts/plugin": "^2.5.0",
-        "ts-proto": "^1.81.3"
-      },
-      "peerDependenciesMeta": {
-        "@protobuf-ts/plugin": {
-          "optional": true
-        },
-        "ts-proto": {
-          "optional": true
-        }
-      }
-    },
     "node_modules/type-check": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@@ -5780,15 +5673,6 @@
       "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
       "dev": true
     },
-    "node_modules/yaml": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
-      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
-      "license": "ISC",
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/yargs": {
       "version": "17.7.2",
       "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
diff --git a/package.json b/package.json
index 3f88a2c23..296be5755 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
   "author": "GitHub",
   "license": "MIT",
   "dependencies": {
-    "@actions/cache": "^4.0.0",
+    "@actions/cache": "^4.0.2",
     "@actions/core": "^1.11.1",
     "@actions/exec": "^1.1.1",
     "@actions/github": "^5.1.1",